小菜鸟学习SpringMVC(一)

来源:互联网 发布:android eventbus源码 编辑:程序博客网 时间:2024/06/05 20:02


一: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个处理器映射器可以共存


<!-- a.配置处理器映射器,springmvc默认的处理器映射器 BeanNameUrlHandlerMapping:根据bean(自定义Controller)的name属性url去寻找handle(Action:Controller) -->
<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.两个处理器适配器


<!-- a.配置处理器适配器,负责执行UserController,实现过Controller接口,springmvc默认的处理器适配器 -->
<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>


0 0