JavaWeb 登录示例

一、示例

        为了对Javaweb中的JSP、Servlet以及Listener和Filter进行简单的总结,创建一个简单的只有登录和注册的小项目,项目采用MVC结构并结合了MyBatis进行简单的数据库操作。项目效果示例如下:

登录页面:

JavaWeb 登录示例_第1张图片

 登录时账号或密码错误:

JavaWeb 登录示例_第2张图片

 注册页面:

JavaWeb 登录示例_第3张图片

 二、实现

2.1 Maven依赖:

  
    
      junit
      junit
      4.11
      test
    
    
    
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    
    
    
    
      org.mybatis
      mybatis
      3.4.6
    
    
    
      mysql
      mysql-connector-java
      8.0.27
    
    
    
      log4j
      log4j
      1.2.12
    
    
      org.slf4j
      slf4j-api
      1.7.12
    
    
      org.slf4j
      slf4j-log4j12
      1.7.12
    
    
    
    
      jstl
      jstl
      1.2
    
    
      taglibs
      standard
      1.1.2
    
  

 2.2 mybatis-config.xml及SqlSessionFactory

         项目中使用了Mybatis作为持久层,因此需要xml配置文件进行配置,并且需要SqlSessionFactory对象,以便获取SqlSession用以操作数据库。





    
        
        
    

    
        
    







    
        
            
                
            
            
                
                
                
                
            
        
    
    
        
    

        使用Mybatis,必然要有SqlSessionFactory类,此处使用ServletContextListener上下文参数监听者,在Context参数创建的时候,对SqlSessionFactory类进行初始化。如下BaseMapperTest类用于初始化创建SqlSessionFactory

public class BaseMapperTest {
    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 使用xml配置文件,初始化SqlSessionFactory
     */
    public static void init(String config){
        try{
            Reader reader= Resources.getResourceAsReader(config);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            reader.close();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }

    /**
     * 由SqlSessionFactory工厂对象,生产SqlSession
     * @return
     */
    public static SqlSession getSqlSession (){
        return sqlSessionFactory.openSession();
    }
}

        通过部署监听者MyServletContextListener类,在上下文参数Context初始化的时候,调用BaseMapperTest类的init()方法,实现对SqlSessionFactory的初始化。

/**
 * 上下文初始化参数监听者
 */
public class MyServletContextListener implements ServletContextListener {
    /**
     * 参数初始化
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //由事件得到ServletContext
        ServletContext sc = servletContextEvent.getServletContext();
        String config = sc.getInitParameter("config"); //获取ServletContext初始参数
        BaseMapperTest.init(config); //上下文初始化参数的时候,使用xml配置文件,初始化SqlSessionFactory
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

2.3 Model

2.3.1 Dao操作

         使用Mybatis,需要将具体的sql语句入mapper.xml文件中,如下所示:




    
        
        
        
        
    

    
    

    
    
        insert into `user`(
            user_name, user_password, create_time)
        values(#{userName}, #{userPassword}, #{createTime, jdbcType=TIMESTAMP})
    

    

        对应mapper.xml文件的映射接口如下所示:

/**
 * 接口文件
 */
public interface UserMapper {
    /**
     * 新增用户
     *
     * @param sysUser
     * @return 返回影响行数
     */
    int insert(User sysUser);

    /**
     * 通过ID查询用户
     * @param id
     * @return
     */
    User selectById(int id);

    /**
     * 查询符合登录条件的用户数
     * @return
     */
    long selectUser(User sysUser);
}

        如下为对应数据库user表格的实体类: 

/**
 * 对应数据库user表格的实体类
 */
public class User {
    private int id;
    private String userName;
    private String userPassword;
    private Date createTime;

    public int getId() {
        return id;
    }

    public String getUserName() {
        return userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public Date getCreateTime() {
        return createTime;
    }

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

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

}

 2.3.2 Service操作

        service操作中包含两个类,分别对应于登录操作以及注册操作,如下所示:

/**
 * 用户登录
 */
public class LoginUser {
    private String userName;
    private String userPassword;

    public LoginUser(String userName,String userPassword){
        this.userName = userName;
        this.userPassword = userPassword;
    }
    /**
     * 登录判断
     * @return
     */
    public User login(){
        User result = null;
        SqlSession sqlSession = BaseMapperTest.getSqlSession(); //获取数据库操作对象
        try{
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = new User();
            user.setUserName(userName);
            user.setUserPassword(userPassword);
            //将新建的对象插入数据库中,返回值result 是执行的SQL影响的行数
            long res = userMapper.selectUser(user);
            if(res>0){
                result = user;
            }else{
                result = null;
            }
        } catch(Exception e){
            e.printStackTrace();
        } finally{
            sqlSession.close();   //关闭链接
        }
        return result;
    }
}
/**
 * 用户注册
 */
public class RegistUser {

    private String userName;
    private String userPassword;

    public RegistUser(String userName, String userPassword){
        this.userName = userName;
        this.userPassword = userPassword;
    }

    /**
     * 注册
     * @return
     */
    public int register(){
        int res = 0;
        SqlSession sqlSession = BaseMapperTest.getSqlSession();
        try{
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = new User();
            user.setUserName(userName);
            user.setUserPassword(userPassword);
            user.setCreateTime(new Date());
            //将新建的对象插入数据库中,返回值result 是执行的SQL影响的行数
            res = userMapper.insert(user);
        } catch(Exception e){
            res = -1;
            e.printStackTrace();
        } finally{
            sqlSession.commit();  //提交操作结果
            sqlSession.close();   //关闭链接
        }
        return res;
    }

}

        此处应该将SqlSession 及响应的操作封装到DAO层,以便更好的体现出MVC的优势。但是作为一个Javaweb示例程序,没有那么严谨,真正的项目应对Dao层及Service层有明确的界限。

2.4 View页面

        首先需要有一个JSP页面,项目中的页面都属于View层。如下,是登录页面:

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


    
    Title




智 能 仪 表 设 备 管 理

登  录

账号或密码错误!





注册页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    
    Title




智 能 仪 表 设 备 管 理

注  册





2.5 Controller(Servlet)

/**
 * 创建一个简单的Servlet类
 */
public class LoginServlet extends HttpServlet {

    /**
     * post请求
     * @param request
     * @param response
     * @throws IOException
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        PrintWriter out=response.getWriter();
        //获取请求携带的参数
        String userName = request.getParameter("name");
        String userPassword = request.getParameter("pwd");
        LoginUser loginUser = new LoginUser(userName,userPassword);
        User user = loginUser.login();
        if(user!=null){
            //登录成功
            request.getSession().setAttribute("user",user);  //设置会话属性,会话属性与请求属性的主要区别在范围
//            request.setAttribute("message", "欢迎用户"+userName); //向request域中放置信息
//            request.getRequestDispatcher("/main.jsp").forward(request, response);//转发到成功页面
            response.setContentType("text/html");
            response.sendRedirect("main.jsp");
        }else{
            //验证失败
            request.setAttribute("message", "用户名或密码错误,请重试!"); //向request域中放置信息
            request.getRequestDispatcher("/index.jsp").forward(request, response);//转发到成功页面
        }
    }
}
/**
 * 注册页面的servlet
 */
public class RegisterServlet extends HttpServlet {
    /**
     * post请求
     * @param request
     * @param response
     * @throws IOException
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        //获取jsp页面传递到服务器的参数
        String userName = request.getParameter("name");
        String usePassword = request.getParameter("pwd");

        RegistUser registUser = new RegistUser(userName,usePassword);
        if(registUser.register()>0){
            //注册成功
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }else{
            //注册失败
            request.setAttribute("message","注册失败");
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }
    }
}

        为了对登录进行检查,我们使用Filter过滤器,对所有请求进行检查,以判断是否登录。

/**
 * 登录检查
 */
public class LoginCheckFilter 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;

        //获取资源请求路径
        String uri = request.getRequestURI();
        String[] loginUri = {"/index.jsp","/register.jsp","/login.do","/register.do","/"};
        //判断是否包含登录相关请求
        for(String path:loginUri){
            if (uri.endsWith(path)) {
                filterChain.doFilter(request,response);
                return;
            }
        }
        //请求的url不在特定uri之内
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            response.setContentType("text/html");
            response.sendRedirect("index.jsp");
        }else{
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {
        //销毁
    }
}

        Filter过滤器有很多应用,如下所示,对编码进行设置:

public class EncodingFilter implements Filter {

    private String encoding = "UTF-8"; // 默认编码UTF-8

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 如果用户配置了编码,则将encoding设置为用户编码
        if(filterConfig.getInitParameter("ENCODING")!=null){
            encoding = filterConfig.getInitParameter("ENCODING");
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 设置请求与响应的编码
        servletRequest.setCharacterEncoding(encoding);
        servletResponse.setCharacterEncoding(encoding);
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        encoding = null;
    }
}

2.6 web.xml



  Archetype Created Web Application

  
  
    config
    mybatis-config.xml
  

  
  
    Encoding
    com.wyf.filter.EncodingFilter
    
      ENCODING
      UTF-8
    
  
  
    LoginCheck
    com.wyf.filter.LoginCheckFilter
  

  
  
    Encoding
    /*  
  
  
    LoginCheck
    /*
  

  
  
    com.wyf.listener.MyServletContextListener
  

  
  
    login
    com.wyf.servlet.LoginServlet
  
  
    register
    com.wyf.servlet.RegisterServlet
  
  
  
    login
    /login.do
  
  
    register
    /register.do
  

三、结束

        本文主要以一个登录注册操作,对Javaweb的基础内容,servlet、jsp、session、listener、Filter以及MVC结构进行简单的总结。

项目源码:https://download.csdn.net/download/sssxlxwbwz/85064123

你可能感兴趣的:(Web服务,servlet,session,Filter,mvc)