一、什么是SSM框架?

SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架。

  1. 其中spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
  2. SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
  3. MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

二、项目准备

本项目使用的是maven模型
1、首先创建Maven项目选择
在这里插入图片描述
2、点击next

3、但是由于国外的数据仓下载jar包速度会偏慢,可以使用阿里云镜像进行下载,可以在.m2文件夹下的setting.xml中加入以下代码

-<mirror>

<id>alimaven</id>

<mirrorOf>central</mirrorOf>

<name>aliyun maven</name>

<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>

</mirror>

4、在user setting files选择setting.xml
5、在properties中添加属性
archeTypeCatlog、internal可以加快Maven骨架生成速度。
6、项目创建完成之后进行配置文件
可以根据下面的链接进行配置
Maven配置文件与jsp

密码是6po5
7、创建规范文件结构
在这里插入图片描述
在这里插入图片描述

用户管理系统项目实现

  1. 用户登录功能
    需要实现的功能是判断用户登录的账号与密码,成功进入页面,错误则登录失败。调用login请求实现
    在这里插入图片描述
    在这里插入图片描述
    关键代码实现
    been.User
public class User {
    public User() {
    }

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

controller


@Controller
@RequestMapping("/user")
public class UserController {

    //new对象
    @Autowired
    private IUserService userService;

    @RequestMapping("/login.do")
    public ModelAndView login(User user, HttpSession session){
        boolean flag=userService.login(user.getUsername(),user.getPassword());
        ModelAndView modelAndView=new ModelAndView();
        if(flag){
            session.setAttribute("user",user);
            modelAndView.setViewName("main");
        }else {
            modelAndView.setViewName("../failer");
        }
        return modelAndView;
    }


UserDao

User findUserByUserName(String username);

UserService

@Service
public class UserService implements IUserService {

   @Autowired
   private UserDao userDao;

   @Override
   public boolean login(String username, String password) {
       User user = userDao.findUserByUserName(username);
       if (user!=null && user.getPassword().equals(password)){
           return true;
       }
       return false;
   }

IUserService

boolean login(String username,String password);

在UserMapper.xml中写sql语句查询数据库数据

   <select id="findUserByUserName" parameterType="String" resultType="com.zhongruan.been.User">
       select * from tb_usr where username=#{username}
   </select>
  1. 完成对用户增删改查功能的实现 在这里插入图片描述

  2. 删除用户
    通过id删除用户信息,调用delete方法,返回findAll.do,显示删除后的信息在这里插入图片描述
    在这里插入图片描述

  3. 新增用户
    向数据库里新增用户信息,调用add方法,返回findAll.do,显示新增用户后的信息在这里插入图片描述

  4. 修改用户信息
    首先调用selectbyid查询出当前用户信息,再使用update方法改写用户信息,修改完成返回findAll.do方法,显示修改完成的用户信息
    在这里插入图片描述

  5. 增删改查关键代码

    controller

 @RequestMapping("/findAll.do")
    public ModelAndView findAll(@RequestParam(defaultValue = "1") int currentPage){

        PageInfo<User> pageInfo=userService.findAll(currentPage);
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("pageInfo", pageInfo);
        modelAndView.setViewName("user-list");
        return modelAndView;
    }

    @RequestMapping("/deleteById.do")
    public String detele(int id){
        userService.deleteById(id);
        return "redirect:findAll.do";

    }

    @RequestMapping("/add.do")
    public String add(User user){
        userService.add(user);
        return "redirect:findAll.do";
    }

    @RequestMapping("/toUpdate.do")
    public ModelAndView toUpdate(int id){
        User user=userService.selectUserById(id);
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.setViewName("user-update");
        modelAndView.addObject("user",user);
        return modelAndView;
    }

    @RequestMapping("/update.do")
    public String update(User user){
        userService.update(user);
        return "redirect:findAll.do";
    }

UserDao

 List<User> findAll(int start);

    void deleteById(int id);

    void add(User user);

    User selectById(int id);

    void update(User user);

UserService

 @Override
    public void deleteById(int id){
        userDao.deleteById(id);
    }

    @Override
    public void add(User user) {
        userDao.add(user);
    }

    @Override
    public User selectUserById(int id) {
        return userDao.selectById(id);
    }

    @Override
    public void update(User user) {
        userDao.update(user);
    }
     @Override
    public PageInfo<User> findAll(int currentPage) {
        PageInfo<User> pageInfo=new PageInfo<>();
        pageInfo.setSize(5);

        int tc=userDao.getTotalCount();
        pageInfo.setTatalCount(tc);
        int tp=(int)Math.ceil(tc/5.0);
        pageInfo.setTotalPage(tp);
        if (currentPage<1){
            pageInfo.setCurrentPage(1);
        }else if(currentPage>tp){
            pageInfo.setCurrentPage(tp);
        }else {
            pageInfo.setCurrentPage(currentPage);
        }

        int start=(pageInfo.getCurrentPage()-1)*5;
        List<User> userList=userDao.findAll(start);
        pageInfo.setList(userList);

        return pageInfo;
    }

IUserService

 void deleteById(int id);

    void add(User user);

    User selectUserById(int id);

    void update(User user);

    PageInfo<User> findAll(int currentPage);
  1. UserMapper.xml的sql语句
<select id="findAll" parameterType="int" resultType="com.zhongruan.been.User">
       select * from tb_usr limit #{start},5
   </select>


    <delete id="deleteById" parameterType="Int">
       delete from tb_usr where id = #{id};
   </delete>


    <insert id="add" parameterType="com.zhongruan.been.User">
        insert into tb_usr (username,password) values (#{username},#{password})
    </insert>


    <select id="selectById" parameterType="int" resultType="com.zhongruan.been.User">
        select * from tb_usr where id=#{id}
    </select>


    <update id="update" parameterType="com.zhongruan.been.User">
        update tb_usr set username=#{username},password=#{password} where id=#{id}
    </update>
  1. 用户表的分页功能实现
    一次性将所有的数据查询出来会增加服务器的负荷,所以需要用分页有选择性地将数据读取。
    一每页五条记录为例
    需要定义list、size (每页查询记录的数量)、totalcount (查询所有记录的数量)、totalpage(查询所有记录所需要的页数) 、currentPage(显示当前页数)。
    benn.PageInfo类
public class PageInfo<T> {
    private List<T> list;

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTatalCount() {
        return tatalCount;
    }

    public void setTatalCount(int tatalCount) {
        this.tatalCount = tatalCount;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    private int totalPage;
    private int size;
    private int tatalCount;
    private int currentPage;
}

Dao

int getTotalCount();

UserMapper.xml的sql语句

 <select id="getTotalCount" resultType="int">
        select count(*) from tb_usr
    </select>

Jsp核心代码

<div class="box-tools pull-right">
						<ul class="pagination">
							<li><a href="${pageContext.request.contextPath}/user/findAll.do" aria-label="Previous">首页</a></li>
							<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageInfo.currentPage-1}">上一页</a></li>
							<c:forEach begin="1" end="${pageInfo.totalPage}" var="pageNum">
								<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageNum}">${pageNum}</a></li>
							</c:forEach>
							<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageInfo.currentPage+1}">下一页</a></li>
							<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageInfo.totalPage}" aria-label="Next">尾页</a></li>
						</ul>
					</div>

在这里插入图片描述
在这里插入图片描述
但这样会有一个小Bug
在首页的时候点击向前一页时或者最后一页向后会报错,所以在Service中改写了部分

if (currentPage<1){
            pageInfo.setCurrentPage(1);
        }else if(currentPage>tp){
            pageInfo.setCurrentPage(tp);
        }else {
            pageInfo.setCurrentPage(currentPage);
        }

这样在currentPage为0时可以显示第一页。
在这里插入图片描述
10. 过滤器
其功能主要是在filter里面判断session里是否有user,如果没有user并且当前的请求不是login.do 跳转到登入页面否则继续执行。
新建filter文件夹和LoginFilter
在这里插入图片描述

public class loginFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        HttpSession session=request.getSession();
        User user=(User) session.getAttribute("user");
        String uri=request.getRequestURI();
        if(user==null&&uri.indexOf("login.do")==-1){
            response.sendRedirect(request.getContextPath()+"../login.jsp");
        }else {
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {

    }
}

配置web.xml

<filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.zhongruan.filter.loginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

这样可以拦截所有.do请求,当session中没有user或不是login返回登录页面。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐