在spring MVC 中,每个请求到DispatcherServlet后根据需求,将会分配到相对应的控制器controller去处理,因此controller在 spring MVC中的作用是非常重要的。本文先介绍两类controller。
一、页面直接跳转
当我们请求一个页面时,由于文件都隐藏在了文件下,无法直接访问,因此需要有一个控制器来实现简单的页面跳转,跳转到对应的页面。这类控制器不需要对请求做太多的处理地,只需实现页面跳转即可。这时,我们可以不需要自己去设计自己的controller,而是直接配置现有的controller类。与页面直接跳转的现有controller主要有以下两个:
1、ParameterizableViewController
我们在“/WEB-INF/jsp/”目录下创建了一个welcome.html文档,为了实现在浏览器中输入welcome.test就直接跳转到welcome.html,spring-servlet.xml文件配置主要如下:
不需要自己写控制器,而是直接调用现有的ParameterizableViewController类来实现。只需要指定对应的视图名就可以。然后就能根据视图解析器去查找需要跳转的页面,视图解析器设置如下:
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".html" />
</bean>
2、UrlFilenameViewController
这个控制器相对于ParameterizableViewController更为简洁,可以不用指明视图名,而直接通过请求的url去查找文件,直接以请求 的URL来确定视图名,然后直接跳转过去。例如请求的url是“welcome.test”,那么从中提取出视图名为“welcome”,而不需要另外指定视图名。这种方法适用于请求的url跟视图名一致。
这两种方法都是直接配置现有的controller类来实现页面的直接跳转,区别在于ParameterizableViewController类可以根据需要指定视图名,较为灵活,而UrlFilenameViewController类只能跳转到跟url对应的视图名,而不能自行指定视图名。
welcome.html文档如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>welcome page</title>
</head>
<body>
<h1>this is the welcome page</h1>
</body>
</html>
启动服务器后,在外部浏览器中输入:http://localhost:8080/springMVC/welcome.test,即可正常跳转到welcome.htm页面。
二、封装表单参数的控制器
一般我们在进行表单登记或者注册时,会要求填较多的信息,这些信息如果按照之前介绍的继承Controller来实现参数的注入,当表单参数较多时,代码就会显得冗余。因此我们希望controller能实现数据的自动封装。这里,我将介绍两种方法来实现表单参数的自动封装。
1、AbstractCommandController
首先需要注意的一个问题是由于AbstractCommandController在spring 3之后就不建议使用了,因此在一些比较新的spring MVC框架中并不包含这个类,这里本着学习的态度,还是了解一下。所以在导入jar包是需要注意版本问题。通过查看各版本的jar包,注意到3.2.2这个版本中包含有AbstractCommandController,读者们可以到 http://repo.spring.io/libs-release-local/org/springframework/spring/3.2.2.RELEASE/ 中下载。在测试中,我导入的jar包如下:
接下来使配置文件,首先配置info.java
和infoController.java
文档
infoController.java
文档
package test.springMVC;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
@SuppressWarnings("deprecation")
public class infoController extends AbstractCommandController {
@Override
protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException exception)
throws Exception {
info inf = (info)command;
System.out.println(inf);
return new ModelAndView("addsucc");
}
}
info.java
文档
package test.springMVC;
public class info {
private String name;
private int num;
private String phone;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum