前端控制器配置,在web.xml中配置前端控制器。前端
<!-- springmvc前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation配置springmvc加載的配置文件(配置處理器映射器、適配器等) 若不配置contextConfigLocation,則默認加載WEB-INF/servlet名稱-servlet.xml(springmvc-servlet.xml) --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 第一種:*.action,訪問以.action結尾,由DispatcherServlet進行解析 第二種:/,全部訪問的地址都由DispatcherServlet進行解析,對靜態文件的解析須要配置不讓DispatcherServlet進行解析 使用此種方式能夠實現RESTful風格的url 第三種:/*,這個配置不對,使用此種配置,最終要轉發到一個jsp頁面時, 仍然由DispatcherServlet進行解析jsp頁面,不能根據jsp頁面找到Handler,會報錯 --> <url-pattern>*.action</url-pattern> </servlet-mapping>
配置處理器適配器:在classpath下的springmvc.xml中配置處理器映射器。web
<!-- 配置 處理器適配器 全部的處理器適配器都實現HandlerAdapter接口 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
public class GoodsController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 調用service查找數據庫,查詢Goods信息列表。 List<Goods> goodsList=null; //返回ModelAndView ModelAndView mav=new ModelAndView(); //至關於request的setAttribute,在jsp中經過goodsList取數據。 mav.addObject("goodsList", goodsList); //指定視圖 mav.setViewName("goodslist.jsp"); return null; } }
配置Handler:將編寫的Handler在spring容器中加載。spring
<!-- 配置Handler --> <bean name="/goods.action" class="cn.test.ssm.contruller.GoodsController"/>
配置處理器映射器:在classpath下的springmvc.xml中配置處理器映射器。數據庫
<!-- 配置 處理器映射器 BeanNameUrlHandlerMapping:將bean的name做爲url進行查找,須要在配置Handler時指定beanname(就是url) 全部的映射器都實現了HandlerMapping接口。--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
非註解的處理器映射器:json
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter:編寫的Handler須要實現Controller接口。瀏覽器
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter:編寫的Handler須要實現HttpRequestHandler接口。mvc
配置HttpRequestHandlerAdapter的適配器:app
<!-- 配置屬於HttpRequestHandlerAdapter的Handler --> <bean id="httpGoodsController" name="/httpgoods.action" class="cn.test.ssm.contruller.HttpGoodsController"/> <!-- 另外一個適配器:HttpRequestHandlerAdapter配置 --> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
將配置的Handler加入url映射配置:jsp
<!-- 另外一個映射器:SimpleUrlHandlerMapping映射 簡單的url映射配置 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!-- prop的value爲配置Handler的id值 對goodsController進行url映射 --> <prop key="/goods1.action">goodsController</prop> <prop key="/goods2.action">goodsController</prop> <!-- 對屬於HttpRequestHandlerAdapter適配器的Handler進行url映射 --> <prop key="/httpgoods.action">httpGoodsController</prop> </props> </property> </bean>
public class HttpGoodsController implements HttpRequestHandler { @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub List<Goods> goodsList=null; request.setAttribute("goodsList", goodsList); request.getRequestDispatcher("/goodslist.jsp").forward(request, response); } }
使用此方法能夠經過修改response,設置相應的數據格式。如:相應的Json數據。ide
response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().wait("Json串");
在前端控制器從spring-webmvc-5.1.5.RELEASE.jar/org.springframework.web.servlet/DispatcherServlet.properties的文件加載處理器映射器、適配器、視圖解析器等組件。若再也不springmvc.xml中配置,使用默認加載的。
註解的處理器映射器和適配器:
在spring3.1以前使用org.springframework.web.servlet.mvc.method.annotation.DefaultAnnotationHandlerMapping註解映射器、org.springframework.web.servlet.mvc.method.annotation.AnnotationMethodHandlerAdapter註解適配器。
在spring3.1以後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping註解映射器、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter註解適配器。
<!-- 配置註解處理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- 配置註解處理器適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- 使用mvc:annotation-driven代替上面註解映射器和註解適配器配置 mvc:annotation-driven默認加載不少的參數綁定方法。 如:json轉換解析器就會默認加載,若使用mvc:annotation-driven不用配置RequestMappingHandlerMapping和RequestMappingHandlerAdapter 實際開發中使用mvc:annotation-driven --> <mvc:annotation-driven></mvc:annotation-driven>
//註解的Handler 在使用註解的映射器和適配器時,註解的映射器和適配器必須配對使用。 import org.springframework.stereotype.Controller; import org.springframework.web.servlet.ModelAndView; /** * 使用@Controller標識該類爲一個控制器。 */ @Controller public class ZJGoodsController { /* * @RequestMapping實現對方法和url進行映射,一個方法對於一個url * 通常建議將url和方法保持一致。後面的action是可選的 */ @RequestMapping("/testFun.action") public ModelAndView testFun()throws Exception{ List<Goods> goodsList=null; ModelAndView mav=new ModelAndView(); mav.addObject("goodslist",goodsList); mav.setViewName("jsp頁面路徑"); return mav; } @RequestMapping("/query") public ModelAndView query()throws Exception{ List<Goods> goodsList=null; ModelAndView mav=new ModelAndView(); mav.addObject("query",goodsList); mav.setViewName("jsp頁面路徑"); return mav; } }
在spring容器中加載Handler:
<!-- 對於註解的Handler能夠單獨配置 --> <bean class="cn.test.ssm.contruller.ZJGoodsController"/> <!-- 註解的Handler單獨配置比較繁瑣,爲方便開發,使用組件掃描來代替。 能夠掃描controller、service等 --> <context:component-scan base-package="cn.test.ssm.contruller"></context:component-scan>
controller方法返回值:
ModelAndView:
返回值爲ModelAndView,須要在方法結束時,定義ModelAndView,將model和view分別進行設置。
String:
若controller方法返回String。
一、表示返回邏輯視圖名:真正視圖(jsp視圖) = 前綴 + 邏輯視圖名 + 後綴。
@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST}) public String query(Model model)throws Exception{ List<Goods> goodsList=null; //ModelAndView mav=new ModelAndView(); //mav.addObject("query",goodsList); //mav.setViewName("jsp頁面路徑"); //當方法返回值爲String時,須要把Model做爲形參傳遞到方法中,經過形參的model將model中數據傳遞到頁面。 //model.addAttribute至關於ModelAndView.addObject model.addAttribute("query",goodsList); return "jsp頁面路徑"; }
二、redirect重定向:如修改功能完成後,重定向到查詢列表頁。redirect重定向特色:瀏覽器地址欄中url會變化。修改提交的request數據沒法傳到重定向的地址。由於重定向後從新進行request。也就是request沒法共享。如:
@RequestMapping("/edit") public String edit()throws Exception{ return "redirect:query.action"; }
三、forward頁面轉發:經過forward進行頁面轉發,瀏覽器地址欄URL不變,request能夠共享。
@RequestMapping("/edit") public String edit()throws Exception{ return "forward:query.action"; }
void:
在controller方法形參中能夠定義request和response,使用request和response指定響應結果。
一、使用request轉發頁面:request.getRequestDispatcher("頁面路徑").forward(request,response);
二、使用response重定向:response.sendRedirect("頁面路徑");
三、使用response指定響應結果。如響應JSON數據:
response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("JSON串")