• springMVC学习笔记(二)-----注解和非注解入门小程序


      最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了。终于在上周五上线了,可以轻松几天了。闲话不扯淡了,继续谈谈springMvc的学习。

      现在,用到SpringMvc的大部分使用全注解配置,但全注解配置也是由非注解发张而来的。所以,今天就谈谈springMvc最基础的注解和非注解的配置以及开发模式。

    一:基础环境准备

    1.功能需求:一个简单的商品列表查询

    2.开发环境:eclipse,java1.7或1.6,springmvc版本:3.2

    3.springMvc所需jar包(一定包括spring-webmvc-3.2.0.RELEASE.jar):

     4.在web.xml中配置前端控制器(web.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">
        <!-- springMvc前端控制器配置 -->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
            <!-- contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加
                   载WEB-INF/servlet名称—servlet.xml(springmvc-servlet.xml)
             -->
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!-- load-on-startup:表示servlet随服务启动; -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <!-- 
                  第一种:*.action 或者 *.do,访问以.action或*.do结尾 由DispatcherServlet进行解析
                  第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
                  使用此种方式可以实现 RESTful风格的url
                  第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,
                  仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。
           -->
            <url-pattern>*.action</url-pattern>
        </servlet-mapping>
        <!-- springMvc前端控制器配置 -->
        
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

     5.建立一个sourceforder,命名为config,在config中增加一个springmvc.xml文件:

      (1).在springmvc.xml中配置处理器适配器

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

    通过查看源码,可知此适配器能执行实现Controller接口的handler:

    6.模拟的商品实体:

    package com.springmvc.entity;
    
    import java.util.Date;
    
    public class Items {
        private Integer id;
    
        private String name;
    
        private Float price;
    
        private String pic;
    
        private Date createtime;
    
        private String detail;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name == null ? null : name.trim();
        }
    
        public Float getPrice() {
            return price;
        }
    
        public void setPrice(Float price) {
            this.price = price;
        }
    
        public String getPic() {
            return pic;
        }
    
        public void setPic(String pic) {
            this.pic = pic == null ? null : pic.trim();
        }
    
        public Date getCreatetime() {
            return createtime;
        }
    
        public void setCreatetime(Date createtime) {
            this.createtime = createtime;
        }
    
        public String getDetail() {
            return detail;
        }
    
        public void setDetail(String detail) {
            this.detail = detail == null ? null : detail.trim();
        }
    }

    7.开发handler(及controller):ItemsController01.java

      需要实现 controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。

    ItemsController01.java的内容:

    package com.springmvc.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 com.springmvc.entity.Items;
    
    /**
     * 
     * @author 阿赫瓦里
     * @Description:实现controller接口的 处理器
     * 
     */
    public class ItemsController01 implements Controller {
    
        public ModelAndView handleRequest(HttpServletRequest req,
                HttpServletResponse res) 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("联想笔记本电脑");
            
            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/items/itemsList.jsp");
    
            return modelAndView;
        }
    
    }

    8.视图jsp编写:itemsList.jsp8.视图jsp编写:itemsList.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>查询商品列表</title>
    </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="0">
    <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>

    9.在springmvc.xml中配置handler

        将编写Handler在spring容器加载

    <!-- 配置Handler -->
        <bean id="itemsController1" name="/queryItems_test1.action" class="com.springmvc.controller.ItemsController01" />

    10.配置处理器映射器

    <!-- 处理器映射器 -->
        <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    11.配置视图解析器

    <!-- 视图解析器
                解析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>

    12.部署调试应该就Ok了,但是注意11步骤中的配置,如果配置了前缀和后缀,controller中的视图路径就不写前缀和后缀了,如果不配置,就写全名就可以了。

    二:非注解的处理器和映射器

    1.非注解处理器映射器

      处理器映射器:

    org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

      另一个映射器:

    org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

    <!--简单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>
                    <prop key="/queryItems3.action">itemsController2</prop>
                </props>
            </property>
        </bean>

    多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

    2.非注解处理器适配器

    package com.springmvc.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 com.springmvc.entity.Items;
    
    /**
     * 
     * @author 阿赫瓦里
     * @Description:实现HttpRequestHandler接口的 处理器
     * 
     */
    public class ItemsController02 implements HttpRequestHandler {
    
        public void handleRequest(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
            List<Items> itemsList = new ArrayList<Items>();
            //向list中填充静态数据
            
            Items items_1 = new Items();
            items_1.setName("笔记本电脑");
            items_1.setPrice(6000f);
            items_1.setDetail("联想笔记本电脑");
            
            Items items_2 = new Items();
            items_2.setName("苹果手机");
            items_2.setPrice(5000f);
            items_2.setDetail("iphone6手机!");
            
            itemsList.add(items_1);
            itemsList.add(items_2);
            //设置模型数据
            req.setAttribute("itemsList", itemsList);
            //设置转发的视图
            req.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(req, resp);
            //使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
            /*
                    response.setCharacterEncoding("utf-8");
                    response.setContentType("application/json;charset=utf-8");
                    response.getWriter().write("json串");*/
        }
        
    }

    3.DispatcherSerlvet.properties

    前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。

    三:注解的处理器映射器和适配器

    在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注解适配器。

    1.配置注解映射器和适配器

    <!-- 注解映射器 -->
        <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> -->

    2.开发注解handler(ItemsController03.java)

    package com.springmvc.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 com.springmvc.entity.Items;
    
    /**
     * 
     * @author 阿赫瓦里
     * @Description:注解开发Handler
     * 
     */
    // 使用Controller标识 它是一个控制器
    @Controller
    public class ItemsController03 {
        // 商品查询列表
        // @RequestMapping实现 对queryItems方法和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("联想笔记本电脑");
    
            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);
    
            // 指定视图
            // 下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
            // modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
            // 上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
            modelAndView.setViewName("items/itemsList");
    
            return modelAndView;
        }
    }

    3.在spring容器中加载Handler

    <!-- 对于注解的Handler可以单个配置
        实际开发中建议使用组件扫描
         -->
        <!-- <bean class="com.springmvc.controller.ItemsController3" /> -->
        <!-- 可以扫描controller、service、...
        这里让扫描controller,指定controller的包
         -->
        <context:component-scan base-package="com.springmvc.controller"></context:component-scan>

    四:springmvc.xml中的内容以及项目工程目录

    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 id="itemsController1" name="/queryItems_test1.action" class="com.springmvc.controller.ItemsController01" />
        <bean id="itemsController2" class="com.springmvc.controller.ItemsController02" />
        <!-- 对于注解的Handler可以单个配置
        实际开发中建议使用组件扫描
         -->
        <!-- <bean class="com.springmvc.controller.ItemsController3" /> -->
        <!-- 可以扫描controller、service、...
        这里让扫描controller,指定controller的包
         -->
        <context:component-scan base-package="com.springmvc.controller"></context:component-scan>
        
        
        
        <!-- 处理器映射器 -->
        <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
        <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"/>
        
        <!-- 注解映射器 -->
        <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> -->
        
        
            <!--简单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>
                    <prop key="/queryItems3.action">itemsController2</prop>
                </props>
            </property>
        </bean>
        
        <!-- 视图解析器
                解析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>

    项目工程目录:

  • 相关阅读:
    java_JDBC(3)
    java_JDBC(2)
    java_JDBC(1)
    seq语句随笔
    bzoj3159: 决战
    bzoj3905: Square
    bzoj3864: Hero meet devil
    有上下界的网络流问题
    uva12538
    bzoj3280: 小R的烦恼
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/5281934.html
Copyright © 2020-2023  润新知