zoukankan      html  css  js  c++  java
  • .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串")
  • 相关阅读:
    Python 网络爬虫
    Linux 下安装 java 运行环境 jdk1.8
    SSH: Transferred 0 file(s) 解决
    java idea 好用的插件
    java idea 安装 环境配置等 注意事项(只是备注给自己看的事项,不是安装教程)
    git 上传已有项目 到git仓库 初始化git并上传
    git 清除远程仓库已经删除的本地分支 清除已经合并到master的本地分支
    oracle trunc 日期 数字 的使用例子
    股票小白2
    股票小白知识点1
  • 原文地址:https://www.cnblogs.com/zltao/p/10630781.html
Copyright © 2011-2022 走看看