小菜鸟学习SpringMVC(一)
一:SpringMVC第一个案例分系
1.导入jre包
2.在web.xml配置前端控制器:DispatcherServlet
<servlet><servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 按默认加载springmvc.xml的规范, 就不需要在这里配置
默认加载规范:
文件名:servlet-name-servlet=====>springmvc-servlet
路径规范:必须在WEB-INF下
-->
<init-param>
<!-- contextConfigLocation 是DispatcherServlet类中的一个参数 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3.springmvc.xml配置 src/config/springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- 配置处理器映射器,springmvc默认的处理器映射器 BeanNameUrlHandlerMapping:根据bean(自定义Controller)的name属性url去寻找handle(Action:Controller) -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 简单url处理器映射器,将url集中处理,管理的只有prop定义号的url,其他地方定义的在这里无效 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props >
<prop key="/ss.do">UserController</prop>
<prop key="/mine.do">http</prop>
<prop key="/abc.do">UserController</prop>
</props>
</property>
</bean>
<!-- 类名首字母小写访问 userController.do 去访问 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
<!-- 配置处理器适配器,负责执行UserController,实现过Controller接口,springmvc默认的处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 负责自定义myController实现过HttpRequestHandler接口, -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!--配置自定义的bean: UserController -->
<bean id="UserController" name="/hello.do" class="com.gog.controller.UserController"></bean>
<bean id="http" name="/good.do" class="com.gog.controller.HttpController"></bean>
<!-- 配置sprigmvc视图解析器:解析逻辑试图 后台返回逻辑试图:index 视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.使用到的 自定义Controller
public class UserController implements Controller {@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("hello", "Let us Go");
//mv.setViewName("/WEB-INF/jsp/inde.jsp"); //物理视图,直接含有物理地址
mv.setViewName("inde"); //逻辑视图,需要解析才能到物理视图
return mv;
}
}
public class HttpController implements HttpRequestHandler{
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("hello", "Let Go to HttpController");
request.getRequestDispatcher("/WEB-INF/jsp/inde.jsp").forward(request, response);
}
}
5. 三个处理器映射器 3个处理器映射器可以共存
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- b.简单url处理器映射器,将url集中处理,管理的只有prop定义号的url,其他地方定义的在这里无效 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props >
<prop key="/ss.do">UserController</prop>
<prop key="/mine.do">UserController</prop>
<prop key="/abc.do">UserController</prop>
</props>
</property>
</bean>
<!-- c.类名首字母小写访问 userController.do 去访问 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
a.BeanNameUrlHandlerMapping
功能:寻找Controller根据url请求去匹配bean的name属性url,从而获取Controller
b.SimpleUrlHandlerMaping
功能:寻找Controller根据浏览器url匹配简单url的key,key又Controller的id找到Controller
c.ControllerClassNameHandlerMapping
功能:寻找Controller 根据类名(MyController)类名.do来访问,类名首字母小写
6.两个处理器适配器
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- b.负责自定义myController实现过HttpRequestHandler接口, -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!--配置自定义的bean: UserController -->
<bean id="UserController" name="/hello.do" class="com.gog.controller.UserController"></bean>
<bean id="http" name="/good.do" class="com.gog.controller.HttpController"></bean>
a.SimpleControllerHandlerAdapter
功能:执行mycontroller,但这个myController类必须实现接口Controller 调用controller里面方法,返回modelAndView。
b.HttpRequestHandlerAdapter
功能:执行myController,但这个myController必须实现接口HttpRequestHandler,并且只能使用物理映射,不能使用逻辑映射
7.使用到的自定义处理器(或者叫控制器或者Controller)
a.实现接口Controller
b.实现接口HttpRequestHandler tip:无法使用类名小写的方式访问处理器映射器
note:在第四点提到
c.继承AbstractCommandController来进行命令控制器 ---这个抽象类已经过时
public class CommondController extendsAbstractCommandController {
public CommondController() {
this.setCommandClass(User.class);
}
@Override
protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command,
BindException errors) throws Exception {
User user =(User) command;
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("show");
return mv;
}
}
8.SpringMVC 的Post中文乱码问题
在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>