一、前言:
上一篇文章我们使用springMVC实现了一个简单的HelloWorld,这篇文章我们实现一个小的Demo,使用springMVC实现简单的注册登录(带拦截器)功能。
二、需求:
1、创建新项目 SPRINGMVC-USER。
2、要求对 /reg.do和 /login.do 能作出响应,响应方式是显示 reg.jsp 和 login.jsp 页面。
3、注册页(reg.jsp)要求有用户名、密码、年龄、手机、邮箱这5个输入项和1个提交按钮。
4、登录页(login.jsp)要求有用户名、密码这2个输入项和1个提交按钮。
5、登录成功以后可以跳转到user_info.jsp和user_password.jsp页面。
首先先分析一下需求,因为我们这里没有使用数据库,所以要将登录信息存到session中,当用户直接访问user_info或user_password页面时,我们去session中查找是否有登录信息,如果有则说明登录过了,直接跳转,如果没有,则重定向到登录页让用户登录,所以这里需要用到拦截器,对直接访问user_info和user_password页面的请求进行拦截,进行登录验证。
(该demo并没有真正的实现注册和登录功能,只是将SpringMVC的流程走了一遍,主要目的是从头到尾的把上一章的HelloWorld练习一遍)
三、实现过程:针对小白的实现过程:
1、首先创建一个maven项目
,SPRINGMVC-USER。(创建过程和上篇文章一样,别忘了生成web.xml文件
,添加Tomcat运行环境
)
2、配置web.xml文件(字符集编码过滤器:放置中文乱码,下面的配置前面都有介绍)。
<!-- 配置字符集编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 1.配置spring的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<!-- 2.启动Tomcat时即初始化该Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3、在src\recourses
下添加一个spring.xml
配置文件。
配置组件扫描:根目录cn.tedu.spring,和前缀后缀。
<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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
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/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="cn.tedu.spring"/>
<!-- 配置视图解析器ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/WEB-INF/"></property>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 经过以上配置后,当前项目中的jsp文件都应该放在/WEB-INF/下-->
</bean>
</beans>
4、创建一个User
实体类,并生成set、get
方法。
package entity;
public class User {
private String username;
private String password;
private Integer age;
private String phone;
private String email;
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public Integer getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getEmail() {
return email;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(Integer age) {
this.age = age;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setEmail(String email) {
this.email = email;
}
}
5、创建一个controller来处理请求。
package cn.tedu.spring.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/login.do")
public String showLogin(){
System.out.println("开始处理登录业务");
return "login";
}
@RequestMapping("/reg.do")
public String showReg(){
System.out.println("开始处理注册业务");
return "reg";
}
@RequestMapping("/info.do")
public String showInfo(HttpSession session){
return "user_info";
}
@RequestMapping("/password.do")
public String showPassword(HttpSession session){
return "user_password";
}
@RequestMapping(value="/handler_login.do",method=RequestMethod.POST)
public String handlerLogin(@RequestParam("username")String username,@RequestParam("password")String password,ModelMap modelMap,HttpSession session){
System.out.println("username=" + username);
System.out.println("password=" + password);
String message;
if ("root".equals(username)) {
if ("1234".equals(password)) {
// 登录成功,记录Session
session.setAttribute("username", username);
// 当前位置:/user/handle_login.do
// 目标位置:/main/index.do
return "redirect:../main/index.do";
} else {
message = "登录失败!密码错误!";
}
} else {
message = "登录失败!用户名不存在!";
}
modelMap.addAttribute("msg", message);
return "error";
}
// 3.5. 附:重定向
@RequestMapping(value="/handler_reg.do",method=RequestMethod.POST)
public String handleReg(@RequestParam("username") String username,ModelMap modelMap){
System.out.println("UserController.handleReg()");
if ("root".equals(username)) {
String message = "您尝试注册的用户名" + username + "已经被占用!";
modelMap.addAttribute("msg", message);
return "error";
}
return "redirect:login.do";
}
}
创建MainController
用来最后登录成功以后展示user_info
和user_password
页面。
package cn.tedu.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/main")
public class MainController {
@RequestMapping("/index.do")
public String showIndex(){
return "index";
}
}
6、添加页面
error.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>Error Message</title>
</head>
<body>
<h1>${msg }</h1>
</body>
</html>
index.jsp页面:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>错误页面</title>
</head>
<body style="font-size: 30px;">
<h1>登陆成功</h1>
<a href="../user/info.do">User_Info.Jsp页面</a><br>
<a href="../user/password.do">User_Password.Jsp页面</a>
</body>
</html>
login.jsp页面:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>登录业务</title>
</head>
<body style="font-size: 30px;">
<form action="handler_login.do" method="post">
<fieldset>
<legend>登录页面</legend>
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="确定">
</fieldset>
</form>
</body>
</html>
reg.jsp页面:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>注册业务</title>
</head>
<body style="font-size: 30px;">
<form action="handler_reg.do" method="post">
<fieldset>
<legend>注册页面</legend>
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
年龄:<input name="age"><br>
电话:<input name="phone"><br>
邮箱:<input name="email"><br>
<input type="submit" value="提交">
</fieldset>
</form>
</body>
</html>
user_info和user_password页面自己随便添加点什么就行,目前还没什么意义。
7、添加拦截器:点击了解 SpringMVC拦截器的使用
package cn.tedu.spring.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor{
CharacterEncodingFilter cef;
//1
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
System.out.println("preHandle()");
//判断session中的数据,得知是否登录表
HttpSession session=request.getSession();
if(session.getAttribute("username")==null){
response.sendRedirect("../user/login.do");
//返回false拦截
return false;
}
//返回true不拦截
return true;
}
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion()");
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle()");
}
}
在spring.xml
文件中添加拦截器
的配置信息:点击了解 如何配置SpringMVC拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置第一个拦截器 -->
<mvc:interceptor >
<!-- 指定拦截路径 不再拦截路径之内的将不予处理,即不在拦截器根本就不运行-->
<mvc:mapping path="/user/info.do"/>
<mvc:mapping path="/user/password.do"/>
<!-- 指定拦截器类 -->
<bean class="cn.tedu.spring.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
8、启动tomcat,访问 http://localhost:8080/SPRINGMVC-02-USER/user/reg.do
注:此处的注册功能并没有真正的实现注册功能,所以登录的时候一定要使用 用户名:root 和 密码:1234,来进行登录。(这里的spring版本为3.2.8 兼容的jdk1.7以下版本)
9、最后说一下整体的执行流程:
首先访问:http://localhost:8080/SPRINGMVC-02-USER/user/reg.do 后。
1)spring会根据路径/user/reg.do
找到对应的Controller来处理该请求。
2)然后 return ''reg"
,所以会跳转到/WEB-INF/reg.jsp
,进行处理。
(因为我们之前配置了 前缀 和 后缀)
3)用户添加完信息之后 会根据action提交到handler_reg.do
来处理。
4)如果注册成功,则直接重定向到登录页面进行登录。return "redirect:login.do";
5)然后跳转到login.jsp
来进行登录。
6)登录成功以后会提交到action="handler_login.do"
来进行处理提交的信息。
7)如果登录成功则重定向
到index页面return "redirect:../main/index.do";
。
如果登录失败,则跳转到错误页面。
8)此外说下拦截器,如果用户直接访问
user_password.jsp页面或user_info.jsp页面,拦截器会判断用户是否完成了登录操作,如果没登录则会重定向到登录页面让用户进行登录。
到这整个流程就完成了,这个小Demo完全就是对上一章的巩固,可以敲着玩玩。
注:如果文章对你有一点帮助,请点个赞吧,谢谢!
点击了解:SpringMVC Controller接收请求参数
点击了解:SpringMVC 控制器的响应
点击了解:SpringMVC 拦截器的内容
点击了解:SpringMVC 的路径问题