1、基于注解的控制器
1.1、Controller注解类型
在src下的Controller包中创建controller.java,示例代码如下:
@Controller
public class IndexController {
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/register")
public String register() {
return "register";
}
}
在配置文件WEB-INF/目录下创建配置文件springmvc-servlet.xml:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.2.xsd">
<!-- 扫描路径 -->
<context:component-scan base-package="controller">
</context:component-scan>
<!--
<bean name="/login" class="controller.LoginController"></bean>
<bean name="/register" class="controller.RegisterController"></bean>
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 后缀 -->
<property name="suffix" value="/.jsp"></property>
</bean>
</beans>
1.2、Request注解类型
建议使用类级别注解,即当中在类上方的@RequestMapping("/index"),这样可以方便维护程序
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping("/login")
public String login(HttpSession session,HttpServletRequest request) {
session.setAttribute("skey","session范围的值");
request.setAttribute("rkey","request范围的值");
return "login";
}
@RequestMapping("/register")
public String register(Model model) {
model.addAttribute("success","注册成功");
return "register";
}
}
1.3、编写请求处理方法
如果需要在请求处理方法中使用Servlet API类型,那么可以将这些类型作为处理方法的参数类型,例如:
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping("/login")
public String login(HttpSession session,HttpServletRequest request) {
session.setAttribute("skey","session范围的值");
request.setAttribute("rkey","request范围的值");
return "login";
}
@RequestMapping("/register")
public String register(Model model) {
model.addAttribute("success","注册成功");
return "register";
}
}
2、Controller接收请求参数的常见方式
2.1、通过实体Bean接收请求参数
通过一个实体bean来接收请求参数,适用于get和post两者,但是bean 的实行名称必须和请求参数名称相同
1、创建首页面的index.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>My JSP 'index.jsp' starting page</title>
</head>
<body>
未注册的用户,请
<a href="${pageContext.request.contextPath}/index/register">注册</a>!
<br /> 已注册的用户,去
<a href="${pageContext.request.contextPath}/index/login">登录</a>!
</body>
</html>
2、完善配置文件springmvc-servlet.xml
resources可以过滤掉不需要dispatcherservlet的资源(即静态资源,css,js,html,images)
注意,在使用resources时必须使用annotation-driven,否则resources元素会组织任意控制器被调用
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.2.xsd">
<!-- 扫描路径 -->
<context:component-scan base-package="controller">
</context:component-scan>
<!--
<bean name="/login" class="controller.LoginController"></bean>
<bean name="/register" class="controller.RegisterController"></bean>
-->
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/html/" mapping="/html/**"></mvc:resources>
<mvc:resources location="/images/" mapping="//images/**"></mvc:resources>
<!-- 配置视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 后缀 -->
<property name="suffix" value="/.jsp"></property>
</bean>
</beans>
3、创建pojo实体类
public class UserForm {
private String uname;
private String upass;
private String reupass;
//此处省略get和set方法
}
4、创建控制器类
在controller包中创建控制器类IndexController和UserController
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/register")
public String register() {
return "register";
}
}
和
@Controller
@RequestMapping("/user")
public class UserController {
// 得到一个用来记录日志的对象,这样在打印信息的时候能够标记打印的是那哪个类的信息
private static final Log logger = LogFactory.getLog(UserController.class);
/**
* 处理信息
* 使用UserForm对象(实体Bean)user接收注册页面提交的请求参数
*/
@RequestMapping("/login")
public String login(UserForm user,HttpSession session,Model model){
if("zhangsan".equals(user.getUname())&&"123456".equals(user.getUpass())){
session.setAttribute("u", user);
logger.info("成功");
return "main";
}else{
logger.info("失败");
model.addAttribute("messageError","用户名或密码错误");
return "login";
}
}
/**
* 处理注册
* 使用UserForm对象(实体Bean)user接收注册页面提交的请求参数
*/
@RequestMapping("/register")
public String register(UserForm user,Model model){
if("zhangsan".equals(user.getUname())&&"123456".equals(user.getUpass())){
logger.info("成功");
return "login";
}else{
logger.info("失败");
//在register.jsp頁面上可以使用EL表达式取出model的uname值
model.addAttribute("uname",user.getUname());
return "register";
}
}
}
5、创建页面视图
在/WEB-INF/jsp目录下创建register.jsp和login.jsp,此处只有(偷懒)register.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 here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register"
method="post" name="registerForm">
<table border="1" bgcolor="lightblue" align="left">
<tr>
<td>姓名:</td>
<td><input class="textSize" type="text" name="uname"
value="${uname}"></td>
</tr>
<tr>
<td>密码:</td>
<td><input class="textSize" type="password" maxlength="20"
name="upass"></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input class="textSize" type="password" maxlength="20"
name="reupass"></td>
</tr>
<td colspan="2" align="center"><input type="button" value="注册"
onclick="allIsNull()"></td>
</table>
</form>
</body>
</html>
2.2通过处理方法的形参接收请求参数
只需要将userController中的部分代码改为:
@RequestMapping("/register")
public String register(String uname,String upass,Model model){
if("zhangsan".equals(uname)&&"123456".equals(upass)){
logger.info("成功");
return "login";
}else{
logger.info("失败");
//在register.jsp頁面上可以使用EL表达式取出model的uname值
model.addAttribute("uname",uname);
return "register";
}
}
2.3通过HttpServletRequest接收请求参数
可将上一部分的代码改为:
@RequestMapping("/register")
public String register(HttpServletRequest request,Model model){
String uname = request.getParameter("uname");
String upass = request.getParameter("upass");
if("zhangsan".equals(uname)&&"123456".equals(upass)){
logger.info("成功");
return "login";
}else{
logger.info("失败");
//在register.jsp頁面上可以使用EL表达式取出model的uname值
model.addAttribute("uname",uname);
return "register";
}
2.4 通过@PathVariable接收URL中的请求参数
注:必须加method属性
// method中的RequestMethod.GET表示该方法的使用模式
@RequestMapping(value = "/register/{uname}/{upass}", method = RequestMethod.GET)
public String register(@PathVariable String uname, @PathVariable String upass, Model model) {
if ("zhangsan".equals(uname) && "123456".equals(upass)) {
logger.info("成功");
return "login";
} else {
logger.info("失败");
// 在register.jsp頁面上可以使用EL表达式取出model的uname值
model.addAttribute("uname", uname);
return "register";
}
}
3、@ModelAttribute
在controller获取的参数中填写@ModelAttribute(“user”) UserForm user则会将请求参数的输入封装到user对象中,二是创建UserForm实例,以user为键值存储在Model对象中