完成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类。如下图所示:
在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; } } |
在创建完该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 ">
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>
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
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; |
接下来我们需要建立数据库。
数据表名: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。