前言:
在使用Spring MVC进行Web应用开发时,Controller是Web应用的核心。Controller实现类包含了对用户请求的处理逻辑,是用户请求和业务逻辑之间的桥梁,是Spring MVC框架的核心部分,负责具体的业务逻辑处理
RequestMappint注解类型
使用org.springframework.web.bind.annotation.RequestMapping注解类型将请求与处理方法一一对应。
1:方法级别注解
@Controller public class IndexController{ @RequestMapping(value="/index/login") public String login()} return "login"; } @RequestMapping(value="/index/register") public String register(){ return "register"; } }
上述代码中有两个RequestMapping注解语句,它们都作用在处理方法上。
2:类级别注解
public class IndexController{ @RequestMapping(value="/login") public String login()} return "login"; } @RequestMapping(value="/register") public String register(){ return "register"; } }
在类级别注解的情况下,控制器类中的所有方法都将映射为类级别的请求。
编写请求处理方法
在控制类中每个请求处理方法可以有多个不同类型的参数以及一个多种类型的返回结果
如果要在请求处理方法中使用Servlet API类型,那么可以将这些类型作为请求处理方法的参数类型
public class IndexController{ @RequestMapping(value="/index/login") public String login()} return "login"; } @RequestMapping(value="/index/register") public String login(HttpSession,HttpServletRequest request){ session.setAttribute("skey","session范围的值"); request.setAttribute("rkey","reqeust范围的值"); return "register"; } }
Controller接受请求参数的常见方式
Controller接受请求参数的方式有很多种,有的适合get请求方式,有的适合post请求方式,有的二者都适合 下面通过一个实例讲解
通过实体bean接受请求参数
创建Web应用ch2_3
在他的WEB/INF/JSP/目录下创建register.jsp 和login.jsp
register.jsp代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/user/register" method="post" name="registForm"> <table border=1> <tr> <td>姓名:</td> <td> <input type="text" name="uname" value="${user.uname }"/> </td> </tr> <tr> <td>密码:</td> <td><input type="password" name="upass"/></td> </tr> <tr> <td>确认密码:</td> <td><input type="password" name="reupass"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="注册" /> </td> </tr> </table> </form> </body> </html>
login.jsp代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/user/login" method="post"> <table> <tr> <td align="center" colspan="2">登录</td> </tr> <tr> <td>姓名:</td> <td><input type="text" name="uname"></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="upass"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="提交" > <input type="reset" value="重置" > </td> </tr> </table> ${messageError } </form> </body> </html>
index.jsp代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> 没注册的用户,请<a href="user/register">注册</a>!<br> 已注册的用户,去<a href="user/login">登录</a>! </body> </html>
创建POJO实体类
在src目录下创建pojo包 并创建实体类UserForm
package pojo; public class UserForm { private String uname;//与请求参数名称相同 private String upass; private String reupass; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpass() { return upass; } public void setUpass(String upass) { this.upass = upass; } public String getReupass() { return reupass; } public void setReupass(String reupass) { this.reupass = reupass; } }
创建控制器类
package controller; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import pojo.UserForm; import service.UserService; @Controller @RequestMapping("/user") public class UserController { //得到一个用来记录日志的对象,这样打印信息的时候能够标记打印的是那个类的信息 private static final Log logger = LogFactory.getLog(UserController.class); //将服务层依赖注入到属性userService @Autowired public UserService userService; /** * 处理登录 */ @RequestMapping("/login") public String login(UserForm user, HttpSession session, Model model) { if(userService.login(user)){ session.setAttribute("u", user); logger.info("成功"); return "main";//登录成功,跳转到main.jsp }else{ logger.info("失败"); model.addAttribute("messageError", "用户名或密码错误"); return "login"; } } /** *处理注册 */ @RequestMapping("/register") public String register(@ModelAttribute("user") UserForm user) { if(userService.register(user)){ logger.info("成功"); return "login";//注册成功,跳转到login.jsp }else{ logger.info("失败"); //使用@ModelAttribute("user")与model.addAttribute("user", user)功能相同 //在register.jsp页面上可以使用EL表达式${user.uname}取出ModelAttribute的uname值 return "register";//返回register.jsp } } }
然后发布并运行应用即可
重定向与转发
重定向是将用户从当前处理请求定向到另一个视图或处理请求,以前的请求中存放的信息全部失效,并进入了新一个的request作用域,转发是将用户对当前处理的请求转发给另一个视图或处理请求,以前request中存放的信息不会失效
转发过程:客户浏览器发送http请求,Web服务器接受此请求,调用内部的一个方法,在容器内部完成请求处理和转发动作,将目标资源发送给客户
重定向过程:客户浏览器发送http请求,Web服务器接收后发送302状态码相应以及对应新的location给客户浏览器
在Spring MVC框架中 控制器类中的处理方法return语句默认就是转发实现,只不过实现的是转发到视图
应用@Autowired进行依赖注入
Spring MVC框架本身就是一个非常优秀的MVC框架,它拥有一个依赖注入的有点,可以通过Atuowired注解类型将依赖注入一个属性或方法
下面实例将应用的登录和注册业务逻辑处理分离出来 使用Service层实现
创建service包 创建一个接口和它的实现类
接口代码如下
package service; import pojo.UserForm; public interface UserService { boolean login(UserForm user); boolean register(UserForm user); }
实现类代码如下
package service; import org.springframework.stereotype.Service; import pojo.UserForm; //注解为一个服务 @Service public class UserServiceImpl implements UserService{ @Override public boolean login(UserForm user) { if("zhangsan".equals(user.getUname()) && "123456".equals(user.getUpass())) return true; return false; } @Override public boolean register(UserForm user) { if("zhangsan".equals(user.getUname()) && "123456".equals(user.getUpass())) return true; return false; } }
@ModelAttribute可以实现以下两个功能
1:绑定请求参数到实体对象(表单的命令对象)
2:注解一个非请求处理方法