• springmvc入门程序


    springmvc的入门程序(和前面的mybatis使用同一个案例,商城的案例。订单,购物车等)

    需求:

    功能需求:

    商品的列表查询

    环境准备:

    Java环境:

    Jdk1.7

    Myeclipes9

    Springmvc版本:spring3.2

    需要spring3.2所有jar,一定要包括spring-webmvc那个

    开发步骤:

    1、导入jar包,这个不解释了。

    2、在web.xml中配置前端控制器:

    <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- contextConfigLocation配置springmvc记载的配置文件(配置处理器映射器、适配器等等)
          如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-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>

    3、在springmvc.xml中操作。

    使用spring的mvc组件,首先需要在你的spring配置文件中加入mvc命名空间:

    xmlns:mvc=http://www.springframework.org/schema/mvc
    ...
    http://www.springframework.org/schema/mvc           
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    2、配置处理器映射器(根据请求查找handler)

    <!-- 处理器映射器 
    将bean的name作为url查找,需要在配置Handler时指定beanname(就是url)
    -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    3、配置处理器适配器(对应的处理器需要遵守适配器规则)

    <!-- 处理器适配器 
        所有的处理器适配器都实现HandlerAdapter接口
    -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    4、编写handler,配置handler

    编写前面控制器规则的handler:

    package cn.itcast.ssm.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import cn.itcast.ssm.domain.Items;
    
    /**
     * 实现Controller接口的处理器
     * @author Administrator
     *
     */
    public class ItemsController1 implements Controller{
    
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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的setAttribute
            modelAndView.addObject("itemsList", itemsList);
            
            //指定视图
            modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
            
            return modelAndView;
        }
    
    }

    装载handler进spring容器:  

    <bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/> 

    然后前面的处理器映射器就可以根据name属性找到指定的handler了

    5、视图的编写:

    我们书写处理器的时候需要指定视图:

    //指定视图
            modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

    所以我的jsp视图:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>查询商品列表</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        <form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
        查询条件:
        <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>
        </form>
      </body>
    </html>
    itemsList.jsp

    6、配置视图解析器

    <!-- 视图解析器 
    解析jsp解析,默认使用jstl标签,classpath下得有jstl的包
    -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

    补充代码:

    package cn.itcast.ssm.domain;
    
    import java.util.Date;
    
    public class Items {
        private int id; 
        private String name;
        private double price;
        private String detail; //商品描述
        private String pic;  //商品图片路径
        private Date createtime;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        public String getDetail() {
            return detail;
        }
        public void setDetail(String detail) {
            this.detail = detail;
        }
        public String getPic() {
            return pic;
        }
        public void setPic(String pic) {
            this.pic = pic;
        }
        public Date getCreatetime() {
            return createtime;
        }
        public void setCreatetime(Date createtime) {
            this.createtime = createtime;
        }
        
    
    }
    items.java
    package cn.itcast.ssm.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import cn.itcast.ssm.domain.Items;
    
    /**
     * 实现Controller接口的处理器
     * @author Administrator
     *
     */
    public class ItemsController1 implements Controller{
    
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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的setAttribute
            modelAndView.addObject("itemsList", itemsList);
            
            //指定视图
            modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
            
            return modelAndView;
        }
    
    }
    itemsController1.java
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/tx
               http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
               http://www.springframework.org/schema/mvc
               http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd" >
               
               <!-- 可以扫描controller、service、...
               这里让扫描controller,指定controller的包
                -->
               <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
        
        <!-- 配置Handler -->
        <!--  
        因为我使用注解handler开发的名字和这里一样,我先将原来的这个名字改一下。
        <bean id="itemsController1" name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/> 
        -->
        <bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1"/>
        <bean id="itemsController2" class="cn.itcast.ssm.controller.ItemsController2"/>
               
    <!-- 处理器映射器 
    将bean的name作为url查找,需要在配置Handler时指定beanname(就是url)
    -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    
    <!-- 处理器适配器 
        所有的处理器适配器都实现HandlerAdapter接口
    -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        
        <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
        
        <!-- 简单url映射 器-->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/queryItems1.action">itemsController1</prop>
                    <prop key="/queryItems2.action">itemsController1</prop>
                    <prop key="/queryItems3.action">itemsController2</prop>
                </props>
            </property>
        </bean>
        
        <!-- 注解的映射器 -->
        <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
        -->
        
        <!--  <mvc:annotation-driven></mvc:annotation-driven>-->
        
        <!-- 对于注解的Handler可以单个配置
        实际开发中建议使用组件扫描
        bean的id可以不写,因为已经使用注解完成了url映射对应 -->
        <!--  <bean class="cn.itcast.ssm.controller.ItemsController3"/> -->
    
    <!-- 视图解析器 
    解析jsp解析,默认使用jstl标签,classpath下得有jstl的包
    -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 配置jsp路径的前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!-- 配置jsp路径的后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    springmvc.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>    
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- contextConfigLocation配置springmvc记载的配置文件(配置处理器映射器、适配器等等)
          如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-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>
      
    </web-app>
    web.xml

    说明:

    springmvc.xml和web.xml都是我完成了整个入门程序后的效果,前面有关的可以看笔记自己推演。

    测试

    7、测试:

    测试链接:

    http://localhost:8080/9-29-01/queryItems.action

    两种404的分析:

    前者404后面没有跟东西,表示找不到地址栏上的对应地址

    后者404后面有东西,说明到了目标地址,然后message中有东西,指定这一个地址,表示到了目标地址后无法跳转到目标地址跳转的地址,那个地址找不到。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    非注解的处理器映射器和适配器(查找handler)

    1、bean名称映射器

    org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

    这个是上一个入门程序我们所使用的处理器映射器,它根据容器中handler的name属性与链接的url进行对应扫描,查找匹配的handler


    配置:

    <!-- 处理器映射器 
    将bean的name作为url查找,需要在配置Handler时指定beanname(就是url)
    -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    2、简单url映射器

    org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

    配置:

    <bean id="itemsController1" name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/>
    
    ...
    <!-- 简单url映射 器-->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/queryItems1.action">itemsController1</prop>
                    <prop key="/queryItems2.action">itemsController1</prop>
                    <prop key="/queryItems3.action">itemsController2</prop>
                </props>
            </property>
        </bean>

    在该配置器中定义key-value键值对将url和handler由id属性对应起来。可以实现一个handler对应多个url

    一个配置文件中可以配置多个处理器映射器吗?

      答案是可以的。两个映射器同时使用,谁先捕获到能处理就交给谁处理。

    非注解的适配器(定义handler规则):

    1、org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

      要求:你编写的Handler需要实现Controller接口

    配置:

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    使用该规则的handler:

    package cn.itcast.ssm.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import cn.itcast.ssm.domain.Items;
    
    /**
     * 实现Controller接口的处理器
     * @author Administrator
     *
     */
    public class ItemsController1 implements Controller{
    
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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的setAttribute
            modelAndView.addObject("itemsList", itemsList);
            
            //指定视图
            modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
            
            return modelAndView;
        }
    
    }

    2、org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

      要求:你编写的Handler需要实现HttpRequestHandler接口

    配置:

    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

    使用的handler代码:

    package cn.itcast.ssm.controller;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.HttpRequestHandler;
    
    import cn.itcast.ssm.domain.Items;
    
    /**
     * 实现Controller接口的处理器
     * @author Administrator
     *
     */
    public class ItemsController2 implements HttpRequestHandler{
    
        public void handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /*
             * 我们发现它的方法和我们Servlet中的service差不多。其实用法也是差不多的
             */
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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的addObject方法
            request.setAttribute("itemsList", itemsList);
            
            //设置转发的视图
            request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
            
            /*
             * 可以通过response修改定义响应内容,比如返回json数据:
             * response.setCharacterEncoding("utf-8");
             * response.setContentType("application/json;charset=utf-8");
             * response.getWriter().write("json串");
             */
        }
    
    
    }

    这种处理器适配器和原始的service差不多,可以通过response修改定义响应的内容。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    注解的处理器和适配器

    1、DispatcherServlet.properties:

    在/org/springframework/web/servlet/DispatcherServlet.properties中装载了一些springMVC的默认配置。所以有时候你不配置映射器和适配器发现springmvc还能正常使用。

    # Default implementation classes for DispatcherServlet's strategy interfaces.
    # Used as fallback when no matching beans are found in the DispatcherServlet context.
    # Not meant to be customized by application developers.
    
    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
        org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
        org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
        org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
        org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
    DispatcherServlet.properties

    2、有关的映射器和适配器:

    Spring3.1之前的注解处理映射器:

             org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

    spring3.1之后的注解处理映射器:

      org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

    spring3.1之前的注解适配器:

      org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

    spring3.1之后的注解适配器:

      org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

    3、配置注解的适配器和映射器:

      <!-- 注解的映射器 -->
        <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></mvc:annotation-driven>-->

    4、注解的适配器和映射器开发

    注解处理器的编写:

    package cn.itcast.ssm.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import cn.itcast.ssm.domain.Items;
    
    
    /**
     * 注解开发的Handler
     * @author Administrator
     *
     */
    //使用@Controller标识它是一个控制器 handler
    @Controller
    public class ItemsController3{
    
        //商品查询列表
        //@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url
        //一般建议将url和方法写成一样
        //url中的后缀现在可加可不加
        @RequestMapping("/queryItems")
        public ModelAndView queryItems()throws Exception{
             
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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=new ModelAndView("/WEB-INF/jsp/items/itemsList.jsp");
            //我们前面使用的是jsp的全路径,如果在视图解析器中配置了jsp的前缀和后缀,可以写成这样:
            ModelAndView modelAndView=new ModelAndView("items/itemsList");
            
            modelAndView.addObject("itemsList", itemsList); 
            
            return modelAndView;
            
        }
    
    
    
    
    }

    注解处理器的配置:

        <!-- 对于注解的Handler可以单个配置
        实际开发中建议使用组件扫描
        bean的id可以不写,因为已经使用注解完成了url映射对应 -->
        <!--  <bean class="cn.itcast.ssm.controller.ItemsController3"/> -->
    
      <!-- 可以扫描controller、service、...
               这里让扫描controller,指定controller的包
                -->
               <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>

    注解处理器开发的知识点:

    @Controller注解标识该类为一个控制器

    //使用@Controller标识它是一个控制器 handler
    @Controller
    public class ItemsController3{

    @RequestMapping注解将实现方法和一个url进行映射

    //商品查询列表
        //@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url
        //一般建议将url和方法写成一样
        //url中的后缀现在可加可不加
        @RequestMapping("/queryItems")
        public ModelAndView queryItems()throws Exception{

    部署调试:

    访问链接:http://localhost:8080/9-29-01/queryItems.action

    注意:

    注解中的bean名不能和前面的bean 的id 或者name相同。

    -----------------------------------------------------------------------------------------------------------

    入门程序小结:

    通过入门程序理解springmvc前端控制器、处理器映射器、处理器适配器、视图解析器用法。

    前端控制器配置:

    第一种:*.action,访问以action结尾由DispatcherServlet进行解析

    第二种:/,所有的访问的地址都由DispatcherServlet进行解析,对于静态的文件我们希望不用DispatcherServlet解析

        使用此种方法可以实现RESTful风格的url

     

    处理器映射器

    非注解处理器映射器(了解)

    注解的处理器映射器(掌握)

             对标记有@Controller类中标记有@RequestMapping的方法进行映射,在@RequestMapping里面定义映射的url。

    使用注解的映射器不用再xml中配置url和handler的映射关系

    处理器适配器

    非注解的处理器适配器(了解)

    注解的处理器适配器(掌握)

             注解处理器适配器和注解的处理器映射器要配对使用。理解为不能使用费注解映射器进行映射

     

    <!-- 注解的映射器 -->

        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

        <!-- 注解的适配器 -->

        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    实际开发中使用mvc:annotation-driven

     

    视图解析器指定前缀和后缀:

       

    <!-- 视图解析器 
    解析jsp解析,默认使用jstl标签,classpath下得有jstl的包
    -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 配置jsp路径的前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!-- 配置jsp路径的后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>

    实际开发中可以这样使用:

            //ModelAndView modelAndView=new ModelAndView("/WEB-INF/jsp/items/itemsList.jsp");
            //我们前面使用的是jsp的全路径,如果在视图解析器中配置了jsp的前缀和后缀,可以写成这样:
            ModelAndView modelAndView=new ModelAndView("items/itemsList");

    补充代码:

    package cn.itcast.ssm.controller;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.HttpRequestHandler;
    
    import cn.itcast.ssm.domain.Items;
    
    /**
     * 实现Controller接口的处理器
     * @author Administrator
     *
     */
    public class ItemsController2 implements HttpRequestHandler{
    
        public void handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /*
             * 我们发现它的方法和我们Servlet中的service差不多。其实用法也是差不多的
             */
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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的addObject方法
            request.setAttribute("itemsList", itemsList);
            
            //设置转发的视图
            request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
            
            /*
             * 可以通过response修改定义响应内容,比如返回json数据:
             * response.setCharacterEncoding("utf-8");
             * response.setContentType("application/json;charset=utf-8");
             * response.getWriter().write("json串");
             */
        }
    
    
    }
    ItemsController2.java
    package cn.itcast.ssm.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import cn.itcast.ssm.domain.Items;
    
    
    /**
     * 注解开发的Handler
     * @author Administrator
     *
     */
    //使用@Controller标识它是一个控制器 handler
    @Controller
    public class ItemsController3{
    
        //商品查询列表
        //@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url
        //一般建议将url和方法写成一样
        //url中的后缀现在可加可不加
        @RequestMapping("/queryItems")
        public ModelAndView queryItems()throws Exception{
             
            //调用service查找数据库,查找商品列表,这里使用静态数据模拟
            List<Items> itemsList=new ArrayList<Items>();
            //向list中填充静态数据
            
            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=new ModelAndView("/WEB-INF/jsp/items/itemsList.jsp");
            //我们前面使用的是jsp的全路径,如果在视图解析器中配置了jsp的前缀和后缀,可以写成这样:
            ModelAndView modelAndView=new ModelAndView("items/itemsList");
            
            modelAndView.addObject("itemsList", itemsList); 
            
            return modelAndView;
            
        }
    
    
    
    
    }
    ItemsController3.java
  • 相关阅读:
    判断以下字符串中出现次数最多的字符,并且算出该字符出现的次数
    status的状态码
    call和apply的区别?
    闭包
    $(document).ready和window. onload的区别
    python_pandas常用操作
    python经典例题
    爬B站并保存成csv文件。提供数据
    data_analysis:初识numpy
    01爬取豆瓣网电影数据进行numpy的练习
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5921039.html
Copyright © 2020-2023  润新知