HBuider直接:新建--项目--填项目名称、选地址、下拉选vue项目(2.6.10)
项目结构这个样子:

1.路由配置(地址)
在src文件夹下创建router文件夹 在router文件夹下面创建js文件 index.js---配置组件的地址 还有导航守卫、路由嵌套也配在这里
1.组件路由
2.组件路由嵌套
3.路由导航
记得跟vue对象关联还有导出路由嗷
- import Vue from 'vue'; /* 导入vue */
- import router from 'vue-router'; /* 导入路由组件 实现组件切换功能 */
- /* 导入自己要用的组件 */
- import Login from "../views/Login.vue";
- import Main from "../views/Main.vue";
- import Logon from "../views/Logon.vue";
-
- import Teacher from "../views/teacher/TeacherList.vue";
- import Student from "../views/student/StudentList.vue";/* 后面是地址 前面名字可以自定义 */
-
- Vue.use(router) /* vue对象跟ruoter关联 */
-
- /* 定义组件 主要是为他提供地址*/
- var rout = new router({
- routes: [ /* 可以定义多组数据 */
- {
- path: '/login',
- /* 给组件配置的地址 */
- name: 'Login',
- /* 可以不写 */
- component: Login,
- /* 指定跟哪个组件对应 */
-
- },
- {
- path: '/main',
- name: 'Main',
- component: Main,
- children: [ /* 路由嵌套*/
- {
- path: '/teacher',
- name: 'Teacher',
- component: Teacher,
- },
- {
- path: '/student',
- name: 'Student',
- component: Student,
- }
- ]
- },
- {
- path: '/logon',
- name: 'Logon',
- component: Logon,
- },
-
- ]
- });
-
-
- //路由导航守卫 一旦发生路由跳转就会发生此函数
- rout.beforeEach((to, from, next) => {//to,from表示从哪来 到哪去 next放行 是她要跳转的地址 验证通过就可以跳转过去 不通过直接跳转回login界面
- if (to.path == '/login') { //如果用户访问的登录页,直接放行
- return next();
- }
- else if(to.path=='/logon'){
- return next();
- }else{
- var account = window.sessionStorage.getItem("account");//用账号查 账号不可能为空
- if (account == null) {//账号为空 表明没有登录 让他去登录界面
- return next("/login");
- } else {
- next();
- }
- }
- })
-
-
- //导出路由对象
- export default rout;
-
2.全局配置
要用的ElementUI组件 还有网络请求库axios 下载和配置 还有刚才的路由也要配置进来 还有响应拦截器
1.下载ElementUI组件、网络请求库axios:
在终端输入:npm i element-ui -s 下载ElementUI
在终端输入:npm install axios 下载axios
2.配置全局路径:
- Vue.config.productionTip = false;//设置不打印生产模式
- import Vue from 'vue';//导入vue.js
- import App from './App.vue';//导入当前目录下的App组件
-
-
- /* 导入路由功能 */
- import router from "./router/index.js"
- Vue.use(router);
-
- /* 导入ElementUI */
- import ElementUI from 'element-ui';
- import "element-ui/lib/theme-chalk/index.css";
- Vue.use(ElementUI);
-
-
-
- //导入网络请求库axios
- import axios from "axios"
- axios.defaults.baseURL="http://localhost:8088/webBack/";//定义后端地址 发送请求的时候就只发送后面的就可以
- Vue.prototype.$http = axios;//将axios绑定到Vue对象中 直接this就可以用vue对象
- axios.defaults.withCredentials = true;//身份认证 这样请求向后端发的时候就会将id放在请求头中一起发 自动发
- /* axios怎么用: 直接this.$http.get或post请求 */
-
-
- //添加响应拦截器
- /* 后端要是响应500 就被拦截器拦截下来 然后提示系统忙 */
- axios.interceptors.response.use((resp)=>{
- if(resp.data==201){
- router.replace("/login");/* 通过上面的路由对象 直接路由跳转 */
- }
- if(resp.data==500){
- ElementUI.Message({message: '系统忙,请稍后再试',type: 'warning'});
- }
-
- return resp;
- },(error)=>{/* 发送请求失败 发都没发出去*/
-
- ElementUI.Message({message: '请求地址有误',type: 'error'});
- return Promise.reject(error);
-
- }
- );
-
-
-
-
-
-
- new Vue({
- render: h => h(App),
-
- router,
-
-
- }).$mount('#app');//把Vue对象跟id为app的绑定起来
- /*即:创建一个Vue对象,并把App组件注册进去 把app标签与Vue对象绑定*/
3.显示组件
在src文件夹下面的App.vue里面 加上<router-view></router-view>让组件显示出来
- <template>
- <div id="app">
- <router-view></router-view><!-- 让组件显示出来 -->
-
- </div>
- </template>
-
- <script>
-
- export default {
-
- }//导出
- </script>
-
- <style>
-
- </style>
-
-
- <!-- App就是一张画布 -->
1.get:通过id查找学生 把id传进去 resp接收返回的数据
- this.$http.get("student?mark=findStudentID&id="+id).then((resp) => {
- then回调的数据resp.date.点出来就可以了 不返回数据的then可以不写
- 比如this.form.num=resp.data.num;拿到后端传回来的num赋给from表单的num
-
-
- });
只是发送请求 没有回调 mark是为了处理doget请求的时候好分辨 因为可能有很多请求发送get请求
this.$http.get("student?mark=delete");
2.post:直接用jsonToString(this.form))方法把表单信息都发送过去
- this.$http.post("back/student?mark=save",jsonToString(this.form)).then((resp) => {
- //发post请求 将表单发过去
- if(resp.data==200){
- this.$message({message: '保存成功',type: 'warning'});
- this.dialogVisible=false;//把页面关掉
- this.$router.go();//更新界面
- }
- });
创建java项目 添加web依赖
项目名 右键 Add Rramework Support... 
勾选 Web Application(4.0)

打开工具栏:点viwe ---点Appearance ---点Toolbar


点工具栏中Add Configurations 点+号

下拉找到Tomcat Server 点进去 点Local

上面的配置好了 点Deployment 把项目部署到服务器
+号 Artifact


ok 再返回Server过去 应用 ok就好了
在WEB-INF文件夹下面创建bli文件夹 在里面导包 记得添加依赖(点包 右键 下拉)

gson是格式的 myspl连接数据库的 servlet服务器的
两种方法
1.在web.xml里面配置 servlet在里面配置 过滤器也在里面配置
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
- <!--xml 可扩展标记语言 主要用于记录数据 有一定规则
- web.xml:是web项目的配置文件,此文件在服务器启动是,由服务器读取 加载里面的配置(servlet、过滤器、监听器...)
- -->
-
- <!--配置注册servlet-->
- <servlet>
- <servlet-name>login</servlet-name>
- <servlet-class>com.ffyc.webback.servlet.LoginServlet</servlet-class>
-
- </servlet>
-
- <!--为servlet配置地址-->
- <servlet-mapping>
- <servlet-name>login</servlet-name>
- <url-pattern>/login</url-pattern>
- </servlet-mapping>
-
-
- <!--配置跨域过滤器-->
- <filter>
- <filter-name>crossFilter</filter-name>
- <filter-class>com.ffyc.webback.filter.CorsFilter</filter-class>
- </filter>
- <!--配置哪些请求进入到过滤器中-->
- <filter-mapping>
- <filter-name>crossFilter</filter-name>
- <url-pattern>/*</url-pattern><!--所有都要进入到过滤器-->
- </filter-mapping>
-
-
- <!--配置编码过滤器-->
- <filter>
- <filter-name>encodFilter</filter-name>
- <filter-class>com.ffyc.webback.filter.EncodFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>encodFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <!--配置后端登录验证过滤器-->
- <filter>
- <filter-name>isloginFilter</filter-name>
- <filter-class>com.ffyc.webback.filter.IsLoginFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>isloginFilter</filter-name>
- <url-pattern>/back/*</url-pattern><!--除了登录不用过滤 其他都要 路径上做文章 登录的路径是/login 其他路径可以前面都
- 加一个back 比如测试的 /back/test-->
- </filter-mapping>
- </web-app>
2.直接在servlet注解配置
@WebServlet(name=" 访问 ",urlPatters=" 地址名 ")

创建个servlet文件夹 把用到的各种servlet放在里面 、创建一个dao文件夹 连接数据库处理的到就放在里面
servlet接收前端传过来的请求 根据mark判断调哪个方法 根据请求的具体又调用dao类里面处理哪些数据的方法 dao里面的方法是跟数据库对接的
比如查询学生列表
1.判断mark调用哪个方法

2.调方法(该方法还是在servlet里面的)

3.调dao里面的方法 与数据库连接
- //查询学生列表的dao操作
- public List<Student> findList (String num,String name) throws ClassNotFoundException, SQLException {
-
- Connection connection=null;
- PreparedStatement ps=null;
- ResultSet rs=null;
- ArrayList<Student> students=new ArrayList<>();//对象储存信息 最后将这个对象返回回去
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
-
- String spl="\n" +
- "SELECT \n" +
- "s.id,\n" +
- "s.num,\n" +
- "s.name sname,\n" +
- "s.gender,\n" +
- "s.phone,\n" +
- "g.name gname,\n" +
- "a.account,\n" +
- "s.oper_time\n" +
- "FROM student s LEFT JOIN grade g ON s.gradeid=g.id \n" +
- " LEFT JOIN admin a ON s.adminid=a.id "+
- "where 1=1";
- /*1=1就不用考虑先后问题了*/
- if (num != null && num != ""){
- spl+=" and s.num="+num;
- }
- if (name != null && name != ""){
- spl+=" and s.name='"+name+"'";
- }
- ps=connection.prepareStatement(spl);
-
-
- rs=ps.executeQuery();//将查询结果封装到rs中 可能多条数据 while循环
- while (rs.next()){
- Student student=new Student();//每循环一次 就new一个对象
- student.setId(rs.getInt("id"));/*以别名为准*/
- student.setNum(rs.getInt("num"));
- student.setName(rs.getString("sname"));
- student.setGender(rs.getString("gender"));
- student.setPhone(rs.getString("phone"));
- student.setGradeName(rs.getString("gname"));
- student.setAccount(rs.getString("account"));
- student.setOperTime(rs.getTimestamp("oper_time"));
- students.add(student);
-
- }
- }finally {
- if (ps!=null){
- ps.close();
- }
- if (rs!=null){
- rs.close();
- }
- if (connection!=null){
- connection.close();
- }
-
- }
- return students;//这里的admin=null
- }
-
-
1、基操
1.拿到返回的对象:resp.data拿到返回来的对象 信息都封装在里面 点就可以拿到了
比如resp.data.id拿到返回来的id
2.日期有格式问题 拿到后要格式化
(resp.data.birthday).toLocaleString();//格式化生日
3.登录成功后可以把拿到的信息放到浏览器里面 就可以显示出来 如显示账号头像昵称
window.sessionStorage.setItem("account",resp.data.account);
然后要显示的话:在要显示的vue界面 的导出里面 把数据放到data的return里面

想在哪里显示就{{account}} 即可
2.路由嵌套--在一个组件里打开另一个组件 即子组件
如在Main.vue组件里打开学生列表组件
1.在Main组件的路由里 加一个子组件children 地址path

2.打开子组件:设置index="刚设置的子组件的地址path" 点击学生管理就会显示出学生列表组件

让组件显示出来 在要显示的区域加<router-view></router-view>

3.在学生列表组件里面再打开添加学生组件
直接在添加学生组件里面 导入组件 注册 显示
1.导入组件
2.注册组件
3.显示组件

- public void save(String num, String name, String gender, String birthday, String phone, String gradeId,int id) throws SQLException, ClassNotFoundException {
-
- Connection connection=null;
- PreparedStatement ps=null;
-
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");//连接数据库
- ps=connection.prepareStatement("" +
- "insert into student(num,name,gender,birthday,phone,gradeId,adminid,oper_time)"+
- "value(?,?,?,?,?,?,?,?)");
- ps.setObject(1,num);
- ps.setObject(2,name);
- ps.setObject(3,gender);
- ps.setObject(4,birthday);
- ps.setObject(5,phone);
- ps.setObject(6,gradeId);
- ps.setObject(7,id);
- ps.setObject(8,new java.util.Date());
-
- ps.executeUpdate();//执行spl语句
-
- } finally {
- ps.close();
- connection.close();
- }
-
- }
- public void deleteStudentById(String id) throws ClassNotFoundException, SQLException {
-
- Connection connection=null;
- PreparedStatement ps=null;
-
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
- ps=connection.prepareStatement("" +
- "delete from student where id=?");
- ps.setObject(1,id);
-
- ps.executeUpdate();//执行sql语句
-
- } finally {
-
- ps.close();
- connection.close();
- }
-
- }
就是把数据库中的信息按表中的信息修改
- public void update(String id, String name, String gender, String birthday, String phone, String gradeId, int adminid) throws ClassNotFoundException, SQLException {
- //修改学生信息
- Connection connection=null;
- PreparedStatement ps=null;
-
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
- ps=connection.prepareStatement("" +
- "update student set name=?,gender=?,birthday=?,phone=?,gradeid=?,adminid=?,oper_time=?"+
- "where id=?");
- ps.setObject(1,name);
- ps.setObject(2,gender);
- ps.setObject(3,birthday);
- ps.setObject(4,phone);
- ps.setObject(5,gradeId);
- ps.setObject(6,adminid);
- ps.setObject(7,new java.util.Date());
- ps.setObject(8,id);//学生id
-
- ps.executeUpdate();
-
- } finally {
-
- ps.close();
- connection.close();
- }
-
- }
- public Student findStudentById(String id) throws ClassNotFoundException, SQLException {
-
- Connection connection=null;
- PreparedStatement ps=null;
- ResultSet rs=null;
- Student student=new Student();
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
- connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
- ps=connection.prepareStatement("select s.id,s.num,s.name,s.gender,s.phone,s.gradeid,s.birthday from student s where id=?");
- ps.setObject(1,id);
- rs=ps.executeQuery();//将查询结果封装到rs中 可能多条数据 while循环
- while (rs.next()){
- //把信息封装在学生对象 把学生对象返回去
- student.setId(rs.getInt("id"));
- student.setNum(rs.getInt("num"));
- student.setName(rs.getString("name"));
- student.setGender(rs.getString("gender"));
- student.setPhone(rs.getString("phone"));
- student.setBirthday(rs.getTimestamp("birthday"));
- student.setGradeid(rs.getInt("gradeid"));
- }
- }finally {
-
- ps.close();
- rs.close();
- connection.close();
- }
- return student;//封装好了就返回回去 别写下一个括号外面 就会返回null
- }
-
- }
1.登录

2.注册

3.主界面

4.新增

5.查询

6.修改

7.删除
