控制器
一、控制器架构图
二、Controller简介
1、收集、验证请求参数并绑定到命令对象;
2、将命令对象交给业务对象,由业务对象处理并返回模型数据;
3、返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名)。
三、转发控制器ServletForwardingController
将接收到的请求转发到一个命名的servlet,具体示例如下:
public class ForwardingServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("Controller forward to Servlet");
} }
<servlet>
<servlet-name>forwarding</servlet-name>
<servlet-class>cn.javass.chapter4.web.servlet.ForwardingServlet</servlet-class>
</servlet>
Ø 当我们请求/forwardToServlet时,会被转发到名字为“forwarding”的servlet处理,该sevlet的servlet-mapping标签配置是可选的。
<!— 在springmvc.xml配置处理器 -->
<bean name="/forwardToServlet"
class="org.springframework.web.servlet.mvc.ServletForwardingController">
<property name="servletName" value="forwarding"></property>
</bean>
四、命令控制器AbstractCommandController
Springmvc通过命令设计模式接受页面参数。
步骤:
1、自定义命令控制器
//从页面接收参数,封装到javabean的user对象中
public class CommandController extends AbstractCommandController{
//指定把参数封装到哪个对象
public CommandController(){
this.setCommandClass(User.class);
}
@Override
protected ModelAndView handle(HttpServletRequest arg0,
HttpServletResponse response, Object command, BindException error)
throws Exception {
//值被封装到命令对象command中
User user = (User) command;
ModelAndView mv = new ModelAndView();
//设置model数据,值可以是任意的pojo
mv.addObject("user",user);
//指定返回视图页面
mv.setViewName("index");
return null;
}
2、定义javabean
public class User {
private Integer id;
private String username;
private String age;
private Date birthday;
private String address;
3、封装参数页面
add.jsp
<body>
<form action="${pageContext.request.contextPath }/command.do" >
姓名:<input type="text" name="username" id="username">
生日:<input type="text" name="birthday" id="birthday">
性别:<input type="text" name="sex" id="sex">
地址:<input type="text" name="address" id="address">
<input type="submit" value="提交">
</form>
</body>
index.jsp:
<body>
${user.username}||${user.age}||${user.birthday}||${user.address}
</body>
4、跳转到add页面
由于add页面在WEB-INF下面不能直接访问,需要通过Controller来访问。
public class ToAddController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
//跳转到添加页面
mv.setViewName("add");
return mv;
}
}
5、在springmvc.xml中配置bean
<!-- 配置自定义的Controller 命令对象 -->
<bean name="/command.do" class="controller.ConmmandController"></bean>
<!-- 跳转到add页面的对象-->
<bean name="/toAdd.do" class="controller.ToAddController"></bean>
中文乱码解决
get请求乱码:
post请求乱码;
配置Spring编码过滤器:在web.xml配置
<filter>
<filter-name>characterEncoding</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>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
时间类型转换
在CommandController 类中重写initBinder()方法:
//从页面接收参数,封装到javabean的user对象中
public class CommandController extends AbstractCommandController{
@Override
protected ModelAndView handle(HttpServletRequest arg0,
HttpServletResponse response, Object command, BindException error)
throws Exception {
//值被封装到命令对象command中
User user = (User) command;
ModelAndView mv = new ModelAndView();
//设置model数据,值可以是任意的pojo
mv.addObject("user",user);
//指定返回视图页面
mv.setViewName("index");
return null;
}
//解决时间类型转换
@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception {
String str = request.getParameter("birthday");
if(str.contains("/")){
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"), true));
}else{
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
}
五、参数控制器ParameterizableViewController
<bean name="/toIndex.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<!-- 配置你所要跳转到视图的名称 -->
<property name="viewName" value="index"></property>//跳转到index页面
</bean>
注意:使用参数控制器:不用自己定义Controller,可以直接使用toIndex进行访问