.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串")

 

posted @ 2019-03-31 12:11  水痕灬  阅读(201)  评论(0编辑  收藏  举报