SpringMVC 高级篇

来源:互联网 发布:翻q 知乎 编辑:程序博客网 时间:2024/06/06 04:03
1,配置文件使用
(配置文件和web.xml中的加载语句用 --> 关联)
WEB-INF/配置文件 --> web.xml中的加载语句
   1) applicationContext.xml -->    <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   </listener>   2) dispatcher-servlet.xml -->  <servlet>  <servlet-name>dispatcher</servlet-name>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  </servlet>   <servlet-mapping>  <servlet-name>dispatcher</servlet-name>  <url-pattern>/*</url-pattern>  </servlet-mapping>

2、WEB/INF/dispatcher-servlet.xml 中对Annotation的配置
1) 使用annocation创建Controller的bean<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>(可有可无,default会自动添加)2)controller bean的扫描    <context:component-scan base-package="controller" />

二、基于CoC的MVC的配置
1、WEB/INF/dispatcher-servlet.xml 中对于url-pattern --> urlHandler的CoC的配置<bean id="cocHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" ><property name="caseSensitive" value="false"/></bean>注:如果不配置这个handlerMapping , tomcat会报org.springframework.web.servlet.DispatcherServlet noHandlerFound2、src/controller 中的配置申明一个SampleController.class :@Controllerpublic class SampleController {@RequestMapping   // 不需要指明请求的路径。@ResponseBody       // 直接打印到客户端,Client 显示 “1”。public String alert() { System.out.println("CoC"); // 控制台显示“CoC” return "1";}}3、请求的urllocalhost:8080/webapp/sample/alert.do或者 当如果该controller只有一个方法的时候,localhost:8080/webapp/sample4、如果请求的Controller中不只有一个Method    1)请求一个没有的方法(如 do方法)No matching handler method found for servlet request: path '/sample/do.do', method 'GET', parameters map[[empty]]    2) 请求一个空的方法(请求的路径只到/sample)No matching handler method found for servlet request: path '/sample/', method 'GET', parameters map[[empty]]5、@InitBinder( org.springframework.web.bind.annotation.InitBinder )1)在controller中使用的Binder       @InitBinderpublic void customizeDataBinder(WebDataBinder dataBinder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");dateFormat.setLenient(false); dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));}2)在自定义的bind method中使用@RequestMapping@ResponseBodypublic String bind(Date myDate) {System.out.println(myDate);return "1";}注: 含义是在url中myDate=2013/3/31这样的格式才能被正确解析,2013-3-31这样的格式是不能被解析的。6、WebBindingInitializer (org.springframework.web.bind.support.WebBindingInitializer)1) 这个是跨所有Controller都能使用的Binder2)配置如下<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="webBindingInitializer"><bean class="validator.GenericBindingInitializer" /></property></bean>3)在validator/生成一个类,类名叫做GenericBindingInitializer 然后它 implements WebBindingInitializer           内含有Method:public void initBinder(WebDataBinder dataBinder, WebRequest request)7、@ModelAttribute("name")1)方法上@ModelAttribute("CoC")public String[] model() {String[] strs = {"c","o","c"};return strs;}注:model方法将在任何请求处理方法执行前调用,Spring MVC 会将该方法返回值以“CoC”为名放入到隐含的模型对象属性列表中。  2)参数上         @RequestMapping@ResponseBodypublic String getModel(@ModelAttribute("CoC") String[] model) {System.out.println(model.length); // 输出为 3    return model.toString();} 8、@SessionAttribute 管理Session数据。       1)在Controller之上声明        @SessionAttributes("CoC") //type=xx.class       2)适用的情况        如果在一些方法参数的ModelMap变量里注入了数据,那么在其他的方法里是不能使用到该模型数据的。        如果使用了@SessionAttribute("CoC"),  这样在某些方法参数上定义的@ModelAttribute("CoC")就可以使用了。9、CoC之Web请求和视图之间的约定1)在dispatcher-servelt中配置<bean  id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"><property name="prefix" value="/jsp/" /><property name="suffix" value=".jsp" /></bean>        注:红色字体标注的id是必须的。而且必须是viewNameTranslator,否则框架不会启用。2)这样在Controller,返回将可以为void@RequestMappingpublic void demo() {System.out.println("Demo.jsp");}                会自动找到/webapp/jsp/sample/demo.jsp的视图。10、基于REST风格的路径变量url = webapp/sample/demo.do@RequestMapping(value = "/sample/{name}.do", method = RequestMethod.GET)public void demo(@PathVariable(value="name") String aName) {System.out.println("Demo.jsp " + aName);  // Demo.jsp demo 同时跳转到了jsp/sample/demo.jsp上。}注:粉红色部分不是必须的,{name}.do则aName为demo。若直接输入{name} 那么aName=demo.do11、模型视图使用@RequestMapping(value = "{name}", method = RequestMethod.GET)public void demo(@PathVariable(value="name") String aName,@ModelAttribute("CoC") String[] model) {//非必须的,因为@ModelAttibute("CoC")已经隐含在模型的对象列表中。System.out.println("Demo.jsp " + aName);}视图demo.jsp中可以直接使用   <c:forEach var="item" items="${CoC}" step="1">  <c:out value="${item}"></c:out>s </br>  </c:forEach>

原创粉丝点击