一、从页面接收参数
Spring MVC接收请求提交的参数值的几种方法:
使用HttpServletRequest获取。
@RequestMapping("/login.do")publicString login(HttpServletRequest request){
String name= request.getParameter("name")
String pass= request.getParameter("pass")
}
使用@RequestParam注解。
@RequestMapping("/login.do")publicString login(HttpServletRequest request,
String name,
@RequestParam("pass")String password) //表单属性是pass,用变量password接收
{
syso(name);
syso(password)
}
使用自动机制封装成实体参数。
用户名:密码://封装的User类
public classUser{privateString name;privateString pass;
}
@RequestMapping("/login.do")publicString login(User user)
{
syso(user.getName());
syso(user.getPass());
}
二、向页面传值
当Controller组件处理后,需要向响应JSP传值时,可以使用的方法:
1),使用HttpServletRequest 和 Session 然后setAttribute(),就和Servlet中一样
Model数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do")publicModelAndView login(String name,String pass){
User user=userService.login(name,pwd);
Map data = new HashMap();
data.put("user",user);return new ModelAndView("success",data);
}
2),使用ModelAndView对象
3),使用ModelMap对象
使用ModelMap参数对象示例:
ModelMap数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do")
publicString login(String name,String pass ,ModelMap model){
User user =userService.login(name,pwd);
model.addAttribute("user",user);
model.put("name",name);
return "success";
}
4),使用@ModelAttribute注解
使用@ModelAttribute示例
在Controller方法的参数部分或Bean属性方法上使用
@ModelAttribute数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do")public String login(@ModelAttribute("user") User user){//TODO
return "success";
}
@ModelAttribute("name")publicString getName(){returnname;
}
5)Session存储:可以利用HttpServletReequest的getSession()方法
@RequestMapping("/login.do")publicString login(String name,String pwd
ModelMap model,HttpServletRequest request){
User user=serService.login(name,pwd);
HttpSession session=request.getSession();
session.setAttribute("user",user);
model.addAttribute("user",user);return "success";
}
6)自定义Map
@ResponseBody
@RequestMapping(value= "/updatestatus", method =RequestMethod.POST)public MapupdateStatus(HttpServletRequest request) {
Map result = new HashMap();
String id= request.getParameter("id");
SystemAdministrator sysadmin=systemAdminBiz.get(Integer.valueOf(id));
sysadmin.setStatus(1);boolean flag =systemAdminBiz.update(sysadmin);
result.put("status", flag);returnresult;
}
@RequestMapping(value = "/list", method ={RequestMethod.POST,RequestMethod.GET})publicString queryAdministrator(HttpServletRequest request,ModelMap model) {
Integer roleId= request.getParameter("roleListById") == null ? 0 : Integer.parseInt(request.getParameter("roleListById"));
Map properties = new HashMap();if(roleId.intValue() > 0) {
properties.put("role:=", roleId);
model.put("roleId", roleId);
}
List administrator =systemAdminBiz.find(properties);
List systemRole =systemRoleBiz.getAll();
model.put("administratorList", administrator);
model.put("roleList", systemRole);return "sys_admin_list";
}
7)Spring MVC 默认采用的是转发来定位视图,如果要使用重定向,可以如下操作
1,使用RedirectView
2,使用redirect:前缀
publicModelAndView login(){
RedirectView view= new RedirectView("regirst.do");return newModelAndView(view);
}
或者用如下方法,工作中常用的方法:
publicString login(){//TODO
return "redirect:regirst.do";
}
三、实例讲解:
步骤一:创建新Web项目,导入Spring MVC包和业务层UserService
1. 创建Web项目导入相关的jar包:
2. 导入前述业务层UserService类以及依赖的类,等。
User类代码如下:
packagecom.souvc.entity;importjava.io.Serializable;public class User implementsSerializable {private static final long serialVersionUID = -603439325380668432L;private intid;privateString name;privateString pwd;privateString phone;publicUser() {
}public User(intid, String name, String pwd, String phone) {this.id =id;this.name =name;this.pwd =pwd;this.phone =phone;
}publicUser(String name, String pwd, String phone) {super();this.name =name;this.pwd =pwd;this.phone =phone;
}public intgetId() {returnid;
}public void setId(intid) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getPwd() {returnpwd;
}public voidsetPwd(String pwd) {this.pwd =pwd;
}publicString getPhone() {returnphone;
}public voidsetPhone(String phone) {this.phone =phone;
}
@Overridepublic inthashCode() {returnid;
}
@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (obj instanceofUser) {
User o=(User) obj;return this.id ==o.id;
}return true;
}
@OverridepublicString toString() {return id + "," + name + "," + pwd + "," +phone;
}
}
UserDao接口代码如下:
packagecom.souvc.dao;importcom.souvc.entity.User;/*** 用户数据访问对象接口*/
public interfaceUserDao {/**根据唯一用户名查询系统用户, 如果没有找到用户信息返回null*/
publicUser findByName(String name);//public User add(String name, String pwd, String phone);//public User find(int id);//public User delete(int id);//public void update(User user);
}
UserService类代码如下:
packagecom.souvc.service;importjava.io.Serializable;importjavax.annotation.Resource;importorg.springframework.stereotype.Service;importcom.souvc.dao.UserDao;importcom.souvc.entity.User;/**业务层 注解*/@Service//默认的Bean ID是 userService
public class UserService implementsSerializable {private static final long serialVersionUID = 7360372166489952236L;privateUserDao userDao;//@Resource//自动匹配userDao对象并注入
@Resource(name = "userDao")public voidsetUserDao(UserDao userDao) {this.userDao = userDao;//}publicUserDao getUserDao() {returnuserDao;
}/**登录系统功能*/
public User login(String name, String pwd) throwsNameOrPwdException,
NullParamException {if (name == null || name.equals("") || pwd == null || pwd.equals("")) {throw new NullParamException("登录参数不能为空!");
}
User user=userDao.findByName(name);if (user != null &&pwd.equals(user.getPwd())) {returnuser;
}throw new NameOrPwdException("用户名或者密码错误");
}
}
NameOrPwdException类代码如下:
packagecom.souvc.service;/**用户名或者密码错误*/
public class NameOrPwdException extendsException {publicNameOrPwdException() {
}publicNameOrPwdException(String message) {super(message);
}publicNameOrPwdException(Throwable cause) {super(cause);
}publicNameOrPwdException(String message, Throwable cause) {super(message, cause);
}
}
NullParamException类代码如下:
packagecom.souvc.service;/**参数为空*/
public class NullParamException extendsException {publicNullParamException() {
}publicNullParamException(String message) {super(message);
}publicNullParamException(Throwable cause) {super(cause);
}publicNullParamException(String message, Throwable cause) {super(message, cause);
}
}
JdbcDataSource类代码如下:
packagecom.souvc.dao;importjava.io.Serializable;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;/**组件注解*/@Componentpublic class JdbcDataSource implementsSerializable {private static final long serialVersionUID = -8925981939329398101L;privateString driver;
@Value("#{jdbcProps.url}")privateString url;
@Value("#{jdbcProps.user}")privateString user;
@Value("#{jdbcProps.pwd}")privateString pwd;publicString getDriver() {returndriver;
}/**必须使用Bean属性输入, 否则不能进行JDBC Driver注册*/@Value("#{jdbcProps.driver}")public voidsetDriver(String driver) {try{//注册数据库驱动
Class.forName(driver);this.driver =driver;
}catch(Exception e) {throw newRuntimeException(e);
}
}publicString getUrl() {returnurl;
}public voidsetUrl(String url) {this.url =url;
}publicString getUser() {returnuser;
}public voidsetUser(String user) {this.user =user;
}publicString getPwd() {returnpwd;
}public voidsetPwd(String pwd) {this.pwd =pwd;
}public Connection getConnection() throwsSQLException {
Connection conn=DriverManager.getConnection(url, user, pwd);returnconn;
}public voidclose(Connection conn) {if (conn != null) {try{
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
MysqlUserDao类代码如下:
packagecom.souvc.dao;importjava.io.Serializable;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Repository;importcom.souvc.entity.User;/**持久层 注解*/@Repository("userDao")//指定特定的Bean ID 方便setUserDao注入
public class MysqlUserDao implementsUserDao, Serializable {private static final long serialVersionUID = 7385842613248394287L;privateJdbcDataSource dataSource;publicMysqlUserDao() {
}/**创建 MysqlUserDAO 对象必须依赖于JDBCDataSource实例*/
publicMysqlUserDao(JdbcDataSource dataSource) {this.dataSource =dataSource;
}
@Autowired//按照类型自动装配
public void setDataSource(@Qualifier("jdbcDataSource")
JdbcDataSource dataSource) {this.dataSource =dataSource;
}publicJdbcDataSource getDataSource() {returndataSource;
}/**根据唯一用户名查询系统用户, 如果没有找到用户信息返回null*/
publicUser findByName(String name) {
System.out.println("利用JDBC技术查找User信息");
String sql= "select id, name, pwd, phone from users where name=?";
Connection conn= null;try{
conn=dataSource.getConnection();
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, name);
ResultSet rs=ps.executeQuery();
User user= null;while(rs.next()) {
user= newUser();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPwd(rs.getString("pwd"));
user.setPhone(rs.getString("phone"));
}
rs.close();
ps.close();returnuser;
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}finally{
dataSource.close(conn);
}
}
}
db.properties文件内容如下:
# config forMysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/souvc
user=root
pwd=123456
spring-mvc.xml文件代码如下:
Mysql数据库初始化SQL代码如下:
DROP TABLE users;
CREATE TABLE USERS
(
ID DOUBLE(7, 0) ,
NAME VARCHAR(50) ,
PWD VARCHAR(50),
PHONE VARCHAR(50) ,
PRIMARY KEY (id)
);
INSERT INTO Users (id, NAME, pwd, phone) VALUES (1, 'Tom', '123', '110');
INSERT INTO Users (id, NAME, pwd, phone) VALUES (2, 'Jerry', 'abc', '119');
INSERT INTO Users (id, NAME, pwd, phone) VALUES (3, 'Andy', '456', '112');
3. 为项目添加JUnit4 API,然后添加测试类TestCase和测试方法testUserService()用于测试上述配置是否正确。TestCase类代码如下:
packagecom.souvc.test;importjava.util.Properties;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importcom.souvc.dao.JdbcDataSource;importcom.souvc.entity.User;importcom.souvc.service.UserService;public classTestCase {
@Testpublic void testUserService() throwsException {
String cfg= "spring-mvc.xml";
ApplicationContext ac= newClassPathXmlApplicationContext(cfg);
Properties obj= ac.getBean("jdbcProps", Properties.class);
JdbcDataSource ds= ac.getBean("jdbcDataSource", JdbcDataSource.class);
System.out.println(obj);
System.out.println(ds);
System.out.println(ds.getConnection());
UserService service= ac.getBean("userService", UserService.class);
User user= service.login("Tom", "123");
System.out.println(user);
}
}
执行测试方法testUserService(),在控制台输出的结果:
{user=root, url=jdbc:mysql://localhost:3306/souvc, driver=com.mysql.jdbc.Driver, pwd=123456}
com.souvc.dao.JdbcDataSource@1cb1a4e2
com.mysql.jdbc.JDBC4Connection@3d04fc23
利用JDBC技术查找User信息1,Tom,123,110
这个结果说明业务层UserService工作正常。
4. 配置Spring MVC 核心控制器DispatcherServlet到web.xml。web.xml配置部分代码参考如下:
index.jsp
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
springmvc
*.form
5. 部署项目到Tomcat并且启动,测试Spring MVC配置是否正常。
在输出结果中出现内容, 并且没有异常就会说明Spring MVC部署正常。
步骤二:实现login-action1.form登录流程,测试利用HttpServletRequrst传值方法
1. 在WEB-INF/jsp文件夹下添加login-form.jsp文件,代码如下所示:
Login Form${message}
登录 login-action1.form
用户
密码
登录 login-action2.form
用户
密码
登录 login-action3.form
用户
密码
登录 login-action4.form
用户
密码
登录 login-action5.form
用户
密码
登录 login-action6.form
用户
密码
方法一解释:
利用HttpServletRequest对象进行浏览器页面到控制器传值。
方法二解释:
使用@RequestParam注解声明表单密码输入框pwd的值注入到password变量,表单中用户名输入框根据名字映自动射注入name变量。 @RequestMapping注解将login-action2.form映射到了checkLogin2()方法。这样就与login- form.jsp表单对应。
方法三解释:
这里采用user作为参数, Spring会自动的将页面表单参数name,pwd注入到user对象的相应属性name,pwd传递到方法中。@RequestMapping将请求login-action3.form映射到方法checkLogin3()。
方法四解释:
在处理方法完成后返回一个ModelAndView对象。
方法五解释:
ModelMap属性值与页面login-form.jsp之间的数据对应。
方法六解释:
@ModelAttribute声明的属性与login-form.jsp页面的值关系。
用户名或者密码错误时候出现的时候,能够记住用户名。
在前述案例中,用户登录成功以后, 可以利用HttpServletRequest对象的getSession()方法访问Session对象, 这样就可以保持用户登录状态了。
2. 为页面添加样式文件styles.css,样式文件保存在WebRoot文件夹下,styles.css文件代码如下所示:
*{
margin:0;
padding:0;
}
h6 {
text-align: center;
color: red;
padding: 10px;
font-size: 14px;
}
form {
padding: 10px;float: left;
}
form div {
border: 1px gray solid;
width: 320px;
padding: 8px;
}
form p input {
width: 180px
}
form h2 input {
text-align: center;
}
form h2 {
background: black;
color: white;
padding: 4px;
}
form p {
background: #ddd;
padding: 4px 8px08px;
}
form h3 {
background: #ddd;
padding: 8px;
}
3. 在WEB-INF/jsp文件夹下添加success.jsp文件,这个文件是登录成功以后显示的界面,代码如下所示:
Success${user.name}登录成功!
上述页面中,使用EL表达式和标准标签库配合显示界面数据, 其中和${base}用于解决绝对路径问题。
4. 创建控制器类LoginController,在该类中使用注解@Controller的方式进行配置:
1)使用@Controller将LoginController声明为控制器Bean组件。
2)使用@RequestMapping("/login")声明对LoginController组件的请求在/login 路径下。
3)流程控制方法loginForm(),用于显示登录表单页面。使用@RequestMapping注解将映射请求/login-form.form到loginForm()方法。
4)增加userService属性,并且使用@Resource注解声明在运行期间注入userService对象。
5)增加控制流程方法checkLogin1(),使用@RequestMapping注解将请求/login-action1.form映 射到checkLogin1()方法。checkLogin1()方法调用userService的login方法,实现登录流程。 checkLogin1()方法主要是测试JSP页面到控制器的数据传输方式。
LoginController类代码如下所示:
packagecom.souvc.controller;importjava.util.HashMap;importjava.util.Map;importjava.util.Random;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Controller;importorg.springframework.ui.ModelMap;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.servlet.ModelAndView;importcom.souvc.entity.User;importcom.souvc.service.NameOrPwdException;importcom.souvc.service.NullParamException;importcom.souvc.service.UserService;
@Controller//@SessionAttributes("user")
@RequestMapping("/login")public classLoginController {
@Resource//请求Spring注入资源 userService
privateUserService userService;
@RequestMapping("/login.form")publicString loginForm() {//可以向表单界面传递一些参数
return "login-form";
}
@RequestMapping("/login-action1.form")//Spring MVC 自动参数注入HttpServletRequest
publicString checkLogin1(HttpServletRequest req) {
System.out.println("---方法一---");//优点直接简洁,缺点需要自己处理数据类型转换, 不支持文件上传功能
String name = req.getParameter("name");
String pwd= req.getParameter("pwd");
System.out.println(name);
System.out.println(pwd);try{
User user=userService.login(name, pwd);//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return "success";
}catch(NameOrPwdException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "login-form";
}catch(NullParamException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "redirect:login.form";
}catch(RuntimeException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "error";
}
}
@RequestMapping("/login-action2.form")public String checkLogin2(String name, @RequestParam("pwd")
String password,//映射表单属性不同的参数
HttpServletRequest req) {
System.out.println("---方法二---");//优点, 自动转换数据类型, 缺点可能出现数据类型转换异常
System.out.println(name);
System.out.println(password);try{
User user=userService.login(name, password);//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return "success";
}catch(NameOrPwdException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "login-form";
}catch(NullParamException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "login-form";
}catch(RuntimeException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "error";
}
}
@RequestMapping("/login-action3.form")publicString checkLogin3(User user, HttpServletRequest req) {
System.out.println("---方法三---");//自动填充到bean对象
System.out.println(user);try{
user=userService.login(user.getName(), user.getPwd());//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return "success";
}catch(NameOrPwdException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "login-form";
}catch(NullParamException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "login-form";
}catch(RuntimeException e) {
e.printStackTrace();
req.setAttribute("message", e.getMessage());return "error";
}
}
@RequestMapping("/login-action4.form")publicModelAndView checkLogin4(String name, String pwd,
HttpServletRequest req) {
System.out.println("---方法四---");
Map data = new HashMap();try{
User user=userService.login(name, pwd);//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return new ModelAndView("success", data);
}catch(NameOrPwdException e) {
e.printStackTrace();
data.put("message", e.getMessage());return new ModelAndView("login-form", data);
}catch(NullParamException e) {
e.printStackTrace();
data.put("message", e.getMessage());return new ModelAndView("login-form", data);
}catch(RuntimeException e) {
e.printStackTrace();
data.put("message", e.getMessage());return new ModelAndView("error", data);
}
}
@RequestMapping("/login-action5.form")publicString checkLogin5(String name, String pwd, ModelMap model,
HttpServletRequest req) {
System.out.println("---方法五---");try{
User user=userService.login(name, pwd);//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return "success";
}catch(NameOrPwdException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "login-form";
}catch(NullParamException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "login-form";
}catch(RuntimeException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "error";
}
}
@RequestMapping("/login-action6.form")publicString checkLogin6(
@ModelAttribute("name") String name,
@ModelAttribute("password") String pwd,
ModelMap model, HttpServletRequest req){
System.out.println("---方法六---");try{
User user=userService.login(name, pwd);//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return "success";
}catch(NameOrPwdException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "login-form";
}catch(NullParamException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "login-form";
}catch(RuntimeException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "error";
}
}
@RequestMapping("/login-action7.form")publicString checkLogin7(ModelMap model, HttpServletRequest req) {
System.out.println("---方法七---");
String name1=req.getParameter("name");
String pwd1=req.getParameter("pwd");try{
User user=userService.login(name1, pwd1);//登录成功将登录用户信息保存到当前会话中
req.getSession().setAttribute("user", user);return "success";
}catch(NameOrPwdException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "redirect:login";
}catch(NullParamException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "redirect:login";
}catch(RuntimeException e) {
e.printStackTrace();
model.addAttribute("message", e.getMessage());return "error";
}
}private String[] msg = { "再来一次", "下次就对了", "没关系还有机会"};
@ModelAttribute("next")publicString getNext() {
Random r= newRandom();returnmsg[r.nextInt(msg.length)];
}
}
5.测试login-action1.form登录流程
通过网址“http://localhost:8080/SpringValues/login/login.form”请求Tomcat服务器:
访问请求的信息打印在控制台:
---方法一---Tom123利用JDBC技术查找User信息---方法二---Tom123利用JDBC技术查找User信息---方法三---
0,Tom,123,null利用JDBC技术查找User信息---方法四---利用JDBC技术查找User信息---方法五---利用JDBC技术查找User信息