spring mvc之二:处理器

前言

在spring mvc中,使用映射处理器可以把web请求映射到正确的处理器上,spring内置了很多映射器,而且我们也可以自定义处理器,映射处理器都能把请求传递到处理器执行链接上,并且处理器执行链接必须包含能处理该请求的处理器,而且处理器链接也能包含一系列拦截器
接下来就是一些常见的处理映射器

BeanNameUrlHandlerMapping

功能:寻找Controller
根据url请求去匹配bean的name属性url,从而获取Controller
这里注意:这是默认的映射器,也就是说我们不配置这个,也能自动执行这个
如:入门程序中的案例:

1
2
<!-- 配置自定义Controler -->
<bean id="mycontrol" name="/hello.do" class="com.zwl.control.mycontrol"></bean>

即根据自定义的/hello.do,找到对应的mycontrol.java类

SimpleUrlHandlerMaping

功能:寻找Controller
根据浏览器url匹配简单url的key,key又Controller的id找到Controller
如:在映射文件中配置

1
2
3
4
5
6
7
8
9
10
11
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="zwl.do">mycontrol</prop>
<prop key="slycmiaoxi.do">mycontrol</prop>
</props>
</property>
</bean>
<!-- 配置自定义Controler -->
<bean id="mycontrol" class="com.zwl.control.mycontrol"></bean>

测试:在浏览器输入http://localhost:100/springmvc1/zwl.do或者http://localhost:100/springmvc1/slycmiaoxi.do

输出结果:

hello world

此外:这个映射器是把url进行集中配置

ControllerClassNameHandlerMapping

功能:寻找Controller
根据类名(Mycontrol)类名.do来访问,类名首字母小写
在配置文件中增加如下配置

1
2
<!-- 定义通过: 类名.do 形式来访问controller -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>

注意,这里并没有声明mycontrol.do和只有一个类mycontrol.java

测试:在浏览器输入http://localhost:100/springmvc1/mycontrol.do
结果:

hello world

事实上,以上三个映射器都可以同时存在

下面将是处理器适配器

SimpleControllerHandlerAdapter

功能:执行controller
调用controller里面方法,返回modelAndView。

1
2
3
4
<!-- 配置处理器适配器执行Controlelr ,springmvc默认的
SimpleControllerHandlerAdapter:执行Controller
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

HttpRequestHandlerAdapter

功能:执行controller
首先新建一个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.zwl.control;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.HttpRequestHandler;
public class httpcontrol implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//给Request设置值,在页面进行回显
request.setAttribute("hello", "lol");
response.setCharacterEncoding("utf-8");
//跳转页面
request.getRequestDispatcher("/index.jsp").forward(request, response);;
}
}

然后在配置文件中配置

1
2
3
4
5
6
7
8
9
<!-- HttpRequestHandlerAdapter负责执行实现接口HttpRequestHandler的后端
控制器。
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!-- 配置自定义HttpController -->
<bean id="http" class="com.zwl.control.httpcontrol"></bean>
<prop key="/zwl.do">http</prop>

测试:在浏览器中输入:http://localhost:100/springmvc1/zwl.do

输出结果:

lol

注意这两个处理器设配器可以共存!

命令控制器

Spring mvc通过命令设计模式接受页面参数。

自定义命令控制器
首先新建一个pojo类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.zwl.pojo;
public class User {
private int id;
private String username;
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
}

自定义控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.zwl.control;
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.config.MvcNamespaceHandler;
import org.springframework.web.servlet.mvc.AbstractCommandController;
import com.zwl.pojo.User;
public class CommandController extends AbstractCommandController {
//指定参数绑定哪个pojo类
public CommandController(){
this.setCommandClass(User.class);
}
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException error)
throws Exception {
//将命令对象强转成用户对象
User user=(User)command;
ModelAndView mv=new ModelAndView();
mv.addObject("user",user);
mv.setViewName("index");
return mv;
}
}

封装参数页面(这里是login.jsp)

1
2
3
4
5
6
7
8
<body>
<form action="${pageContext.request.contextPath }/command.do" method="post">
姓名:<input type="text" name="username" id="username">
id:<input type="text" name="id" id="id">
<input type="submit" value="提交">
</form>
</body>

配置bean

1
<bean name="/command.do" class="com.zwl.control.CommandController"></bean>

回显数据:

1
2
3
4
<body>
${user.username } <br>
${user.id } <br>
</body>

测试:在浏览器中输入http://localhost:100/springmvc1/login.jsp到login.jsp
然后分别将name输入中文和非中文,发现出现中文乱码

需要Spring编码过滤器:在web.xml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<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>

然后输入中文,就没有乱码了

热评文章