• springMVC学习(1)


    spring mvc的位置:
    springMVC只是spring的一个模块;
     
    第一步:发起请求到前端控制器(DispatcherServlet)
    第二步:DispatcherServlet请求HandlerMapping查找Handler(可以根据xml配置或注解进行查找)
    第三步:HandlerMapping向DispatcherServlet返回Handler
    第四步:DispatcherServlet调用HandlerAdapter去执行Handler
    第五步:HandlerAdapter去执行Handler
    第六步:Handler执行完成给HandlerAdapter返回ModalAndView
    第七步:HandlerAdapter向DispatcherServlet前端控制器返回ModalAndView
    第八步:DispatcherServlet请求视图解析器进行解析,根据逻辑视图名解析成真正的视图(jsp等);
    第九步:视图解析器向DispatcherServlet返回View
    第十步:DispatcherServlet进行视图渲染,将数据填充到request域;response响应结果
     
    组件:
    1.前端控制器DispatcherServlet,相当于转发器
    2.处理器映射器HandlerMapping,根据url查找Handler
    3.处理器适配器HandlerAdapter,执行Handler
    4.处理器Handler
    5.视图解析器View resolver,进行视图解析,根据逻辑视图名解析真正的视图
    6.视图View,是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...);
     
    一、环境搭建:
    springmvc独立运行的jar包:
    二、入门程序
    1、前端控制器DispatcherServlet配置:
    <!-- springmvc前端控制器 -->
      <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等)
            如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.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>

     springmvc.xml下配置:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.2.xsd 
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
        
        <!-- 配置Handler -->
        <bean name="/queryItems.action" class="com.cy.controller.ItemsController1"/>
        
        <!-- 处理器映射器 
            将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)所有的映射器都实现 HandlerMapping接口。
         -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
        
        <!-- 处理器适配器  所有处理器适配器都实现 HandlerAdapter接口 -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
        
        <!-- 视图解析器
            解析jsp视图,默认使用jstl标签,classpath下的得有jstl的包
         -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
    </beans>

    编写handler:

    开发handler,要实现controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter执行
    public class ItemsController1 implements Controller{
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
            //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
            List<Items> itemsList = new ArrayList<Items>();
            Items items_1 = new Items();
            items_1.setName("联想笔记本");
            items_1.setPrice(6000f);
            items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
            
            Items items_2 = new Items();
            items_2.setName("苹果手机");
            items_2.setPrice(5000f);
            items_2.setDetail("iphone6苹果手机!");
            
            itemsList.add(items_1);itemsList.add(items_2);
    
            //返回ModelAndView
            ModelAndView modelAndView =  new ModelAndView();
            //相当 于request的setAttribut,在jsp页面中通过itemsList取数据
            modelAndView.addObject("itemsList", itemsList);
            
            //指定视图
            modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
            return modelAndView;
        }
    }

    视图jsp编写:

    <table width="100%" border=1>
    <tr>
    <td><input type="submit" value="查询"/></td>
    </tr>
    </table>
    商品列表:
    <table width="100%" border=1>
        <tr>
            <td>商品名称</td>
            <td>商品价格</td>
            <td>生产日期</td>
            <td>商品描述</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${itemsList }" var="item">
        <tr>
            <td>${item.name }</td>
            <td>${item.price }</td>
            <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
            <td>${item.detail }</td>
            <td><a href="${pageContext.request.contextPath }/item/editItem.action?id=${item.id}">修改</a></td>
        </tr>
        </c:forEach>
    </table>

    url访问http://localhost:8080/springMVC/queryItems.action,图:

     三、对入门程序的补充:

    1)另一个非注解的处理器映射器:在上述springmvc.xml中添加简单url映射器:

    可以看到:多个处理器映射器可以并存,前端控制器判断url能让那些映射器映射,就让正确的映射器处理.

    <!-- 配置Handler -->
        <bean id="itemsController1" name="/queryItems.action" class="com.cy.controller.ItemsController1"/>
        
        <!-- 处理器映射器 
            将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)所有的映射器都实现 HandlerMapping接口。
         -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
        
        <!--简单url映射  -->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <!-- 对itemsController1进行url映射,url是/queryItems1.action -->
                    <prop key="/queryItems1.action">itemsController1</prop>
                    <prop key="/queryItems2.action">itemsController1</prop>
                </props>
            </property>
        </bean>

    现在url中访问:

    http://localhost:8080/springMVC/queryItems1.action

    http://localhost:8080/springMVC/queryItems2.action

    http://localhost:8080/springMVC/queryItems.action都可以正确访问;

     2)另一个非注解的适配器:

    这个HttpRequestHandlerAdapter适配器要求Handler实现HttpRequestHandler接口:

    <!-- 配置另外一个Handler -->
        <bean id="itemsController2" name="/queryItems3.action" class="com.cy.controller.ItemsController2" />
        
        <!-- 处理器映射器 
            将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)所有的映射器都实现 HandlerMapping接口。
         -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
        
        <!-- 另一个非注解的适配器 -->
        <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
        
        <!-- 视图解析器
            解析jsp视图,默认使用jstl标签,classpath下的得有jstl的包
         -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

    Handler:

    public class ItemsController2 implements HttpRequestHandler{
    
        @Override
        public void handleRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
                //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
                List<Items> itemsList = new ArrayList<Items>();
                Items items_1 = new Items();
                items_1.setName("联想笔记本");
                items_1.setPrice(6000f);
                items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
                
                Items items_2 = new Items();
                items_2.setName("苹果手机");
                items_2.setPrice(5000f);
                items_2.setDetail("iphone777苹果手机!");
                
                itemsList.add(items_1);itemsList.add(items_2);
                
                //设置模型数据
                request.setAttribute("itemsList", itemsList);
                //设置转发的视图
                request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response);
                
                //使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
                /*
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/json;charset=utf-8");
                response.getWriter().write("json串");*/
        }
    }

    现在浏览器中访问http://localhost:8080/springMVC/queryItems3.action就能访问了;

  • 相关阅读:
    pdf文件预览实现
    RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 问题解决
    Git、GitHub、GitLab三者之间的联系及区别(转)
    html中:befoer和:after用法(转)
    html中box-shadow用法(转)
    js/vue实现滑块验证(方法3)
    vue实现滑块验证(使用awsc实现)(方法1)
    js/vue实现滑块验证(组件形式,可重复调用)(方法2)
    js实现图片上传
    【英语】IT English (随时更新...)
  • 原文地址:https://www.cnblogs.com/tenWood/p/6267342.html
Copyright © 2020-2023  润新知