栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

maven项目的部署开发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

maven项目的部署开发

CSDN对maven项目的部署开发

从配置Maven环境到写出第一个Maven项目_05年的程序员的博客-CSDN博客

1.回顾JDBC项目开发步骤

2.Mybatis框架sql书写位置以及dao层不方法重载的原因

3.Maven+MyBatis项目开发思路 1.建表+书写实体类

①注意:实例类必须实现Serializable实现序列化

②下载lombok使用注解替代快捷键生成全参构造、无参构造、toString(可以不用,但有必要)

package com.gr.entity;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
import java.io.Serializable;
​

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Serializable {
    private Integer id;
    private String name;
    private String sex;
    private String tel;
    private Integer age;
​
    public Student(String name, String sex, String tel, Integer age) {
        this.name = name;
        this.sex = sex;
        this.tel = tel;
        this.age = age;
    }
}

2.新建maven项目 ①修改GroupID com.gr ②补全项目结构

③根据需求添加及修改配置文件引入依赖

注意:webapp一旦无蓝点证明如下标签没有在pom.xml配置,配置后点击屏幕右侧maven刷新项目

war

1.在pom.xml下引入依赖

pom.xml



    4.0.0
​
    com.gr
    MyBatisStudentManageProject
    1.0-SNAPSHOT
​
    
        utf-8
        8
        8
    
    war
    
    
        
            mysql
            mysql-connector-java
            8.0.23
        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        
        
            jstl
            jstl
            1.2
        
        
        
            org.projectlombok
            lombok
            1.18.10
        
​
        
            junit
            junit
            4.11
            test
        
        
        
        
            org.mybatis
            mybatis
            3.5.4
        
        
        
            org.slf4j
            slf4j-log4j12
            1.7.30
        
    

2.resources根目录下添加设置mybatis-config.xml文件(配置文件1)

位置:main/resources





        
        
            
            
            
            

                
                

                
            
        
        
        
    
​
​

3.resources根目录下添加设置log4j.properties(配置文件2)

位置:main/resources

log4j.rootLogger=DEBUG, stdout
​
# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
​
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

4.resources目录下建分层com/gr/dao文件夹下加入替换daoimpl的xxxMapper.xml,用来书写sql替换书写繁琐的dao层实现类

模板



​
依照模板书写sql实现dao层方法



    
        select s_id id,name,sex,tel,age from t_student
    
    
        insert into t_student values(null,#{name},#{sex},#{tel},#{age})
    
    
        delete from t_student where s_id=#{id}
    
    
        update t_student set name=#{name},sex=#{sex},tel=#{tel},age=#{age} where s_id=#{id}
    
    
        select s_id id,name,sex,tel,age from t_student limit #{start},#{pageSize}
    
    
        select s_id id,name,sex,tel,age from t_student
    
    
        insert into t_student values(null,#{name},#{sex},#{tel},#{age})
    
    
        delete from t_student where s_id=#{id}
    
    
        update t_student set name=#{name},sex=#{sex},tel=#{tel},age=#{age} where s_id=#{id}
    
    
        select s_id id,name,sex,tel,age from t_student limit #{start},#{pageSize}
    
    
        select user_id as userId,user_name as username,password from t_user 
        where user_id = #{a}
    

一个参数时,#{}中内容可以任意,实战时#{}中保持和参数名相同。

4.2多个参数

方法:

public User selectUserByNameAndPassword(@Param("username")String name,@Param("password")String password);
​

mapper.xml

多个参数时,使用Param注解给参数起别名,在mapper.xml中#{}里填注解值。注意:一个参数时,也可以使用Param注解,但是一旦使用注解,#{}中必须使用注解值。

4.3对象参数

不使用Param注解时:#{}中直接使用属性名

    方法:

    public void updateUser(User u);

    mapper.xml

    
            update t_user
            set user_name = #{username},
            password = #{password}
            where user_id = #{userId}
        

使用注解时:#{}中填 注解名.属性名

    方法

    public void updateUser(@Param("user")User u);

    mapper.xml

    
            update t_user
            set user_name = #{user.username},
            password = #{user.password}
            where user_id = #{user.userId}
        

实战时:一个参数时不用注解,多个参数时使用注解。

4.4 MyBatisUtils工具类

MyBatisUtils:抽取MyBatis编程中共性的代码。

基本思路:

第1版MyBatisUtils

public class MyBatisUtils {
    //创建SqlSession
    public static SqlSession openSession() {
        //1 读取配置文件
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("mybatis-config.xml");
        }catch(Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        //2 创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3 创建SqlSession对象
        SqlSession sqlSession= factory.openSession();
        return sqlSession;
    }
    
    //关闭sqlSession
    public static void close(SqlSession sqlSession) {
        sqlSession.close();
    }
}

优化的思路:

Resources:读取配置文件(IO读取)

​ 建议:读取配置文件只发生一次,定义在静态代码块中

SqlSessionFactory:创建SqlSession对象

建议:重量级对象(占据更多的内存),应该保证其单例

SqlSession:封装了一个Connection

​ 建议:保证service和dao获取到同1个sqlSession

MyBatisUtils最终版本

public class MyBatisUtils {
     //2 创建SqlSessionFactory对象
    private static SqlSessionFactory factory;
    static {
        //1 读取配置文件
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("mybatis-config.xml");
            factory =  new SqlSessionFactoryBuilder().build(in);
        }catch(Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    //创建SqlSession
    public static SqlSession openSession() {
        //3 创建SqlSession对象
        SqlSession sqlSession= factory.openSession();
        return sqlSession;
    }
    
    //关闭sqlSession
    public static void close(SqlSession sqlSession) {
        sqlSession.close();
    }
}

利用工具类的优化书写ServiceImpl,以学生管理系统业务层为例

package com.gr.service.impl;
​
import com.gr.dao.StudentDao;
import com.gr.entity.Student;
import com.gr.service.StudentService;
import com.gr.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
​
import java.util.ArrayList;
import java.util.List;
​
public class StudentServiceImpl implements StudentService {
    @Override
    public Student selectStudentById(Integer id) {
        SqlSession session=null;
        Student student=null;
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            student=studentDao.selectStudentById(id);
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
​
​
        return student;
    }
​
    @Override
    public List selectAllStudent() {
        SqlSession session=null;
        List list=new ArrayList<>();
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            list=studentDao.selectAllStudent();
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
​
​
        return list;
    }
​
    @Override
    public void deleteStudentById(Integer id) {
        SqlSession session=null;
​
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            studentDao.deleteStudentById(id);
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
    }
​
    @Override
    public void insertStudent(Student student) {
        SqlSession session=null;
​
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            studentDao.insertStudent(student);
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
    }
​
    @Override
    public void updateStudent(Student student) {
        SqlSession session=null;
​
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            studentDao.updateStudent(student);
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
    }
​
    @Override
    public List selectByPage(int start, int pageSize) {
        SqlSession session=null;
        List studentList=null;
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            studentList=studentDao.selectByPage(start,pageSize);
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
        return studentList;
    }
​
    @Override
    public int selectCount() {
        SqlSession session=null;
        int n=0;
        try {
            session= MyBatisUtils.openSession();//1.获取sqlSession对象
            StudentDao studentDao=session.getMapper(StudentDao.class);// 2.获取dao对象
            n=studentDao.selectCount();
            session.commit();
        }finally {
            MyBatisUtils.close(session);
        }
        return n;
    }
}
​
5.书写jsp页面 5.1登录:

表单form action="${pageContext.request.contextPath}/login" method="post"

提交表单(button或input-submit)至LoginController(@WebServlet("/login"))

    
    

LoginController

package com.gr.controller;
​
import com.gr.entity.User;
import com.gr.service.UserService;
import com.gr.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​

@WebServlet("/login")
public class LoginController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UserService userService=new UserServiceImpl();
        //1.收参
        String username= req.getParameter("username");
        String password= req.getParameter("password");
        //2.处理业务
        User user =userService.loginByNameAndPassword(username,password);
        System.out.println(user);
        if (user!=null){
            resp.sendRedirect(req.getContextPath()+"/selectAllStudent");
        }else {
            resp.sendRedirect(req.getContextPath()+"/index.jsp");
        }
    }
}

登录写完后,一般建议设置两个filter

1.CharSetFilter

package com.gr.filter;
​
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/user
        HttpServletRequest request=(HttpServletRequest) servletRequest;//获取请求对象
        HttpSession session =request.getSession();
        HttpServletResponse response=(HttpServletResponse) servletResponse;//获取响应对象
        //从session作用域中获取对应登录成功的对象
        Student student=(Student) session.getAttribute("student");
        if (student!=null){//如果学生对象不为空说明登录成功,放行
            filterChain.doFilter(request,servletResponse);
        }else {
            response.sendRedirect(request.getContextPath()+"login.jsp");
        }
    }
    @Override
    public void destroy() {
    }
}
5.2查询所有:

①书写SelectAllXxxController

@WebServlet("/user/findAllStudent")
package com.gr.controller;
​
import com.gr.entity.Student;
import com.gr.service.StudentService;
import com.gr.service.impl.StudentServiceImpl;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
​
//@WebServlet("/selectAllStudent")
public class SelectAllStudentController extends HttpServlet {
    StudentService studentService=new StudentServiceImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List studentList= studentService.selectAllStudent();
        req.setAttribute("studentList",studentList);
        req.getRequestDispatcher("/student_list.jsp").forward(req,resp);
    }
}
​

查询成功将集合放入request作用域并跳转至查询所有jsp将request作用域中的集合

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    学生信息表
​


​
​
    
        ​                        
添加学生信息
            ​                                                                                                                                                                                                                                                                                                                                                                                        
学生信息表
学生ID学生姓名学生性别学生电话学生年龄相关操作
${student.id}${student.name}${student.sex}${student.tel}${student.age}                        删除                        修改                    
  当前是第${curPage}页,共 ${totalPage}页            上一页                下一页    

注意:查询所有的jsp中可以定义对页面显示的数据的增删改+批量删除

批量删除思路:

1.首先先将写好的展示所有表格用form表单包裹住,遍历展示所有数据过程中增加一个复选框用来将选中数据提交到后台

批量删除按钮提交 ...在表头第一行书写批量删除按钮

书写批量删除controller,重定向至分页查询所有controller让用户知道是否操作成功

package com.gr.controller;
​
import com.gr.service.StudentService;
import com.gr.service.impl.StudentServiceImpl;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/multiDelete")
public class MultiDeleteStudentController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收从student_list.jsp form表单提交过来的CheckBox选中的ids数据
        String[] ids=req.getParameterValues("ids");
        StudentService studentService=new StudentServiceImpl();
        
        for (int i=0;i 

2.在遍历过程中添加复选框,等于每条数据前都有一列复选框,用来选中用户想批量删除的对象

<%--复选框选中,相当于选中当前id,且复选框value就是当前id,然后点击批量删除按钮,将选中的数据提交到后台。只能批量删除不能批量修改--%>

3.增加

增删改查首先要对底层方法书写测试完备,才能保证后期调错效率,因为底层没写完毕异常了很多次了,所以要格外注意编程习惯

需要SelectXxxByPage(用户点击添加超链接)→addxxx.jsp→AddXxxController(req.getParameter接收到用户输入的添加数据,需要类型转换的注意转换,对应数据封装成对象调用业务层方法添加该对象进入mysql数据库,重定向至查询所有controller→查询所有jsp,让用户得知是否添加成功)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    
        
        添加新学生
        
    
    
        
            
            
                添加新学生>>>
            
            
                
                    
                        
                            
<%--不需要将自增id传给对象,id直接传null  --%>
<%--                                --%>
                                
                                
                            
                            
                                
                                
                            
                            
                                
                                
                            
                            
                                
                                
                            
                            
                                
                                
                            
                        
                    
                
            
        
    

4.删改思路与其相同(使用td包裹住操作的超链接)

4.1删除

在查询所有的jsp的c:foreach遍历标签中添加超链接,实现每条数据后面都有删除超链接

用?id=${xxx.id}向删除controller发送要删除的数据id

删除
package com.gr.controller;
import com.gr.service.StudentService;
import com.gr.service.impl.StudentServiceImpl;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/delStudent")
public class DeleteStudentById extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收student_list传过来的数据
        String idStr=req.getParameter("id");
        int id=Integer.parseInt(idStr);
        StudentService studentService=new StudentServiceImpl();
        studentService.deleteStudentById(id);
        
        resp.sendRedirect(req.getContextPath()+"/selectAllStudent");
    }
}

4.2修改

同上在循环中添加超链接

修改

修改controller

package com.gr.controller;
import com.gr.entity.Student;
import com.gr.service.StudentService;
import com.gr.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/updateStudent")
public class UpdateStudentController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
​
        String idStr=req.getParameter("id");
        int id=Integer.parseInt(idStr);
        String name=req.getParameter("name");
        String sex=req.getParameter("sex");
        String tel=req.getParameter("tel");
        String ageStr=req.getParameter("age");
        int age=Integer.parseInt(ageStr);
        Student student=new Student(id,name,sex,tel,age);
        StudentService studentService=new StudentServiceImpl();
        studentService.updateStudent(student);
​
        resp.sendRedirect(req.getContextPath()+"/selectAllStudent");
    }
}
5.运行时常见问题及解决方法见MyBatis异常文档

异常文档MyBatis框架.docx

1.mybatis-config.xml 飘红UserDaoTest中获取不到SqlSession对象

原因:没有引入MyBatis依赖和slf4j依赖

MyBatis开发步骤

终于有大神把 MyBatis 企业项目实用操作讲得明明白白了

MyBatis之SqlSessionFactory和SqlSession

框架:myBatis之SqlSessionFactory和SqlSession_自强不息,厚德载物。-CSDN博客

2. 测试类点击运行后,报sql异常

原因:xml文件中不能使用sql注释方式

3.小蓝点的设置

 

3. 运行时找不到mapping

原因:未在mybatis-config.xml中配置mapper路径

4. 查询单个后查询不到结果

5. 修改完分页点击登录报500 jsp语句异常

contextPath写成contextPage

6. 修改jsp数据填写完毕点击提交按钮405

出现HTTP Status 405 - HTTP method GET is not supported by this URL 原因是:

①**继承自Httpservlet的Servlet没有重写对于请求和响应的处理方法:doGet或doPost等方法,默认调用父类的doGet或doPost等方法**。

②父类HttpServlet的doGet或doPost等方法覆盖了你写的到doGet或doPost等方法。

7. 点击完添加学生 报数学运算异常

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号

${stu.id} ${stu.name}