.Net转Java自学之路—SpringMVC框架篇二(入门案例)
前端控制器配置,在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中配置处理器映射器。
<!-- 配置 处理器适配器 所有的处理器适配器都实现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容器中加载。
<!-- 配置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"/>
非注解的处理器映射器:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter:编写的Handler需要实现Controller接口。
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter:编写的Handler需要实现HttpRequestHandler接口。
配置HttpRequestHandlerAdapter的适配器:
<!-- 配置属于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映射配置:
<!-- 另一个映射器: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数据。
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。
1、表示返回逻辑视图名:真正视图(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页面路径"; }
2、redirect重定向:如修改功能完成后,重定向到查询列表页。redirect重定向特点:浏览器地址栏中url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request。也就是request无法共享。如:
@RequestMapping("/edit") public String edit()throws Exception{ return "redirect:query.action"; }
3、forward页面转发:通过forward进行页面转发,浏览器地址栏URL不变,request可以共享。
@RequestMapping("/edit") public String edit()throws Exception{ return "forward:query.action"; }
void:
在controller方法形参中可以定义request和response,使用request和response指定响应结果。
1、使用request转发页面:request.getRequestDispatcher("页面路径").forward(request,response);
2、使用response重定向:response.sendRedirect("页面路径");
3、使用response指定响应结果。如响应JSON数据:
response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("JSON串")