用户登录案例

完成Spring MVC框架搭建;

本实验完成用户登录验证功能。用户在登录页面输入账号进行登录,如果验证通过则跳转到成功页面,验证失败跳转到失败页面。

通过用户管理实验,完整的介绍了Spring MVC框架从视图-控制器-模型的整个流程。借此,熟悉从前端数据请求到后台数据的持久化的运转逻辑,有助于加强对MVC思想的掌握。

在jsp目录下新建目录demo。在该文件夹下添加login.jsp文件。login.jsp文件用来作为该项目的前端页面展示,也即view视图层。下面添加静态页面代码。复制如下代码到login.jsp文件中。

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

    pageEncoding="utf-8"%>

DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Insert title heretitle>

head>

<body>

       <form action="<%=request.getContextPath()%>/service/demo/user/login" method="get">

              <table>

                     <tr><td>用户名:td><td><input type="text" name="username" />td>tr>

                     <tr><td>密码:td><td><input type="password" name="password" />td>tr>

                     <tr><td colspan="2"><input type="submit" value="登录"/>td>tr>

              table>

       form>

body>

html>

将项目添加到tomcat中,并启动tomcat,在浏览器中访问:http://localhost:8080/mvc_demo/jsp/demo/login.jsp。

同时,为了体现比较完整的登录过程,再添加登录成功和登录失败两个页面,使登录结果更直观。

在demo文件夹下添加faillure.jsp文件。该页面用来表示登录失败后的跳转页面。复制如下代码:

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

    pageEncoding="utf-8"%>

DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>登录失败页面title>

head>

<body>

       <h1>登录失败,原因:${data.msg}h1>

body>

html>

在demo文件下添加main.jsp文件。该页面用来表示登录成功后的跳转页面。复制如下代码:

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

    pageEncoding="utf-8"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>     

DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>登录成功页面title>

head>

<body>

       <h1>${data.userName}你好,欢迎登录用户管理系统!h1>

body>

html>

至此,前端展示界面完成。但是,还不能进行功能处理,需要接下来的逻辑处理。

控制层

在src文件夹下创建文件路径为com.inspur.demo目录。在demo文件夹下创建controller文件夹,在该文件夹下创建名为LoginController的java类。

package com.inspur.demo.controller;

//引入所需要的Spring

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

//声明为控制层类

@Controller

//声明Rest服务的类主路径

@RequestMapping("/demo/user")

publicclass LoginController {

 

}

 

在创建完该controller类后,我们需要在修改spring-servlet.xml配置文件,添加controller注册的扫描。代码如下红色字体:

xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:beans="http://www.springframework.org/schema/beans"

       xmlns:p="http://www.springframework.org/schema/p"

       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

                    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

                    http://www.springframework.org/schema/context

                    http://www.springframework.org/schema/context/spring-context-3.2.xsd

                    http://www.springframework.org/schema/mvc

                    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

                    ">

      

       <mvc:annotation-driven />

      

      

       <context:component-scan base-package="com.inspur.**.controller">context:component-scan>

 

      

       <bean

              class="org.springframework.web.servlet.view.InternalResourceViewResolver"

              p:prefix="/jsp/"

              p:suffix=".jsp">

       bean>

      

beans> 


在LoginController类中添加判断用户身份的逻辑。我们添加如下方法:

@RequestMapping("/login")

public ModelAndView login(@RequestParam(value="username", required=false) String userName, @RequestParam(value="password", required=false) String password){

     

    return null;

}

因为用到了用户信息,所以,我们需要首先添加一个用户信息的javabean类,里面封装了操作用户属性的方法。在demo文件夹下创建data文件,在该文件夹下创建User类。如下图所示:

Bean层

在User类中编写操作用户属性的代码,代码如下:

package com.inspur.demo.data;

 

import java.io.Serializable;

 

import javax.persistence.Column;

import javax.persistence.Id;

import javax.persistence.Table;

import javax.persistence.Transient;

 

@Table(name = "demo_user")

public class User implements Serializable {

 

    @Id

    private Integer id;

 

    @Column(name = "user_id")

    private String userId;

 

    @Column(name = "user_name")

    private String userName;

 

   private String nickname;

 

    private String password;

 

    @Column(name = "is_admin")

    private String isAdmin = "N";

 

   public Integer getId() {

      return id;

   }

 

   public void setId(Integer id) {

      this.id = id;

   }

 

   public String getUserId() {

      return userId;

   }

 

   public void setUserId(String userId) {

      this.userId = userId;

   }

 

   public String getUserName() {

      return userName;

   }

 

   public void setUserName(String userName) {

      this.userName = userName;

   }

 

   public String getNickname() {

      return nickname;

   }

 

   public void setNickname(String nickname) {

      this.nickname = nickname;

   }

 

   public String getPassword() {

      return password;

   }

 

   public void setPassword(String password) {

      this.password = password;

   }

 

   public String getIsAdmin() {

      return isAdmin;

   }

 

   public void setIsAdmin(String isAdmin) {

      this.isAdmin = isAdmin;

   }

}

服务层

在controller层我们需要调用service层来处理业务逻辑。所以,我们接着在demo文件夹下创建service文件夹,在该文件夹下创建IUserService接口类。

在创建完该service类后,我们需要在修改applicationContext.xml配置文件,添加service注册的扫描。代码如下红色字体:

xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:beans="http://www.springframework.org/schema/beans"

       xmlns:p="http://www.springframework.org/schema/p"

       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

                    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

                    http://www.springframework.org/schema/context

                    http://www.springframework.org/schema/context/spring-context-3.2.xsd

                    http://www.springframework.org/schema/mvc

                    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

                    ">

                   

       "com.inspur.**.service">

                  

beans>

在IUserService类中,只需要定义一个接口方法即可。代码如下:

package com.inspur.demo.service;

 

import com.inspur.demo.data.User;

 

publicinterface IUserService {

 

   /**

    * 根据userName获取用户信息

    * @paramuserName

    */

   public User getByUserName(String userName);

  

}

接下来需要实现该接口类,完成业务逻辑处理。在service文件夹下创建impl文件夹,并在该文件夹下创建实现类UserServiceImpl类。

在该类中首先需要实现IUserService接口。然后,编写getByUserName方法来进行事务处理。代码如下:

package com.inspur.demo.service.impl;

 

import org.springframework.stereotype.Service;

 

import com.inspur.demo.data.User;

import com.inspur.demo.service.IUserService;

 

@Service("userService")

publicclass UserServiceImpl implements IUserService{

  

   /**

    * 根据userName获取用户信息

    * @param userName

    */

   public User getByUserName(String userName){

      returnnull;

   }

}

持久层

在getByUserName方法中我需要完成获取用户信息的逻辑。在这里我们需要调用持久层,即dao层完成查询数据库的任务。下面我们来编写供getByUserName方法调用的dao层代码。在demo文件夹下创建dao文件夹,并在该文件夹下创建UserMapper接口类。

在创建完该dao层后,我们需要在修改mybatis-context.xml配置文件,添加dao层的扫描。代码如下红色字体:

xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

                                          http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

                                          http://www.springframework.org/schema/context

                                          http://www.springframework.org/schema/context/spring-context-3.2.xsd

                                          http://www.springframework.org/schema/tx

                                          http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"

       >

 

       <bean id="mybatisTransactionManager"

              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

              <property name="dataSource" ref="dataSource" />

       bean>

 

       <tx:annotation-driven transaction-manager="mybatisTransactionManager" />

 

      

       <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

              <property name="dataSource" ref="dataSource" />

              <property name="configLocation" value="/WEB-INF/spring/mybatis-config.xml"/>

       bean>

      

      

       "org.mybatis.spring.mapper.MapperScannerConfigurer">

              "basePackage" value="com.inspur.**.dao" />

              "sqlSessionFactoryBeanName" value="sqlSessionFactory" />

         

      

beans>

UserMapper类代码如下:

package com.inspur.demo.dao;

 

import com.inspur.demo.data.User;

 

publicinterface UserMapper {

  

   /**

    * 根据userName获取用户信息

    * @param userName

    */

   public User getByUserName(String userName);

}

在UserMapper接口类中我们定义了getByUserName方法,调用这个方法将会从下面要写的UserMapper.xml中查询出用户数据。接下来,我们需要编写SQL语句去数据库查询用户信息。在dao文件夹下创建UserMapper.xml文件。在该文件中复制如下查询代码:

xml version="1.0" encoding="UTF-8"?>

DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

<mapper namespace="com.inspur.demo.dao.UserMapper">

 

       <resultMap type="com.inspur.demo.data.User" id="userResultMap">

              <id property="userId" column="user_id" />

              <result property="userName" column="user_name" />

              <result property="password" column="password" />

       resultMap>

 

       <select id="getByUserName" resultMap="userResultMap" >

              SELECT * FROM demo_user where user_name=#{userName}

       select>

 

mapper>

至此,我们就完成了持久层代码编写。这样,我们就可以在接口实现类UserServiceImpl中调用dao层方法完成数据查询。UserServiceImpl类完成调用dao层的代码如下红色字体代码:

@Service("userService")

publicclass UserServiceImpl implements IUserService{

   

    @Autowired

    private UserMapper userMapper;

   

    /**

     * 根据userName获取用户信息

     * @param userName

     */

    public User getByUserName(String userName){

       returnuserMapper.getByUserName(userName);

    }

}

由于上面使用User这个类,所以我们需要引入如下类才能完成编译,代码如下:

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import com.inspur.demo.dao.UserMapper;

import com.inspur.demo.data.User;

import com.inspur.demo.service.IUserService;

到这里,我们就完成了service层的方法调用。这下我们就可以回到前面的controller层来调用service层的逻辑代码了。在controller的login方法中添加调用service方法的代码如下红色字体:

@RequestMapping("/login")

       public ModelAndView login(@RequestParam(value="username", required=false) String userName,

                     @RequestParam(value="password", required=false) String password){

 

              ModelAndView mv = new ModelAndView();

              Map map = new HashMap();

             

              if(userName!=null && !"".equals(userName)

                            && !"".equals(password) && password!=null){

                     User user = userService.getByUserName(userName);

                     if(user==null){//没有该用户

                            map.put("msg", "没有该用户");

                            mv.setViewName("demo/faillure");

                     } elseif(!password.equals(user.getPassword())){//用户密码不正确

                            map.put("msg", "用户密码不正确");

                            mv.setViewName("demo/faillure");

                     } else{                 

                            map.put("userName", userName);

                            mv.setViewName("demo/main");

                     }

              }else{

                     map.put("msg", "用户名和密码不能为空");

                     mv.setViewName("demo/faillure");

              }

              mv.addObject("data", map);

              returnmv;

       }

在调用service代码时,用到了userService变量,该变量是IUserService类型的,我们需要在方法的一开始进行声明,代码如下红色字体:

publicclass LoginController {

  

   @Autowired

   private IUserService userService;

     

   @RequestMapping("/login")

   public ModelAndView login(@RequestParam(value="username", required=false) String userName,

         @RequestParam(value="password", required=false) String password){

这样,controller层的流程控制就完成了,引入如下类,完成编译:

import java.util.HashMap;

import java.util.Map;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;

 

import com.inspur.demo.data.User;

import com.inspur.demo.service.IUserService;

初始化SQL

接下来我们需要建立数据库。

数据表名:user

Sql语句:

####用户#####

CREATETABLE demo_user (

    id intNOTNULL AUTO_INCREMENT,

    user_id varchar(30) NOTNULL,

    user_name varchar(30) NOTNULL,

    nickname varchar(30),

    password varchar(128) NOTNULL,

    is_admin varchar(1) NOTNULLdefault'N' comment 'N: 普通用户  Y: 管理员',

    primarykey (id)

)DEFAULTCHARACTERSET utf8 COLLATE utf8_general_ci;

insertinto demo_user values(1,'test1','测试员1','测试员1','111111','Y');

insertinto demo_user values(2,'test2','测试员2','测试员1','111111','N');

发布运行

至此,用户登录项目开发完成。将该项目发布到tomcat中,启动tomcat,在浏览器中访问:http://localhost:8080/mvc_demo/jsp/demo/login.jsp

 

 


你可能感兴趣的:(Spring)