• 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中的内容)

     
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     6     <!-- springMvc前端控制器配置 -->
     7     <servlet>
     8         <servlet-name>springmvc</servlet-name>
     9         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    10         <init-param>
    11         <!-- contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加
    12                载WEB-INF/servlet名称—servlet.xml(springmvc-servlet.xml)
    13          -->
    14             <param-name>contextConfigLocation</param-name>
    15             <param-value>classpath:springmvc.xml</param-value>
    16         </init-param>
    17         <!-- load-on-startup:表示servlet随服务启动; -->
    18         <load-on-startup>1</load-on-startup>
    19     </servlet>
    20     <servlet-mapping>
    21         <servlet-name>springmvc</servlet-name>
    22         <!-- 
    23               第一种:*.action 或者 *.do,访问以.action或*.do结尾 由DispatcherServlet进行解析
    24               第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
    25               使用此种方式可以实现 RESTful风格的url
    26               第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,
    27               仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。
    28        -->
    29         <url-pattern>*.action</url-pattern>
    30     </servlet-mapping>
    31     <!-- springMvc前端控制器配置 -->
    32     
    33     <welcome-file-list>
    34         <welcome-file>index.jsp</welcome-file>
    35     </welcome-file-list>
    36 </web-app>
     

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

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

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

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

    6.模拟的商品实体:

     
     1 package com.springmvc.entity;
     2 
     3 import java.util.Date;
     4 
     5 public class Items {
     6     private Integer id;
     7 
     8     private String name;
     9 
    10     private Float price;
    11 
    12     private String pic;
    13 
    14     private Date createtime;
    15 
    16     private String detail;
    17 
    18     public Integer getId() {
    19         return id;
    20     }
    21 
    22     public void setId(Integer id) {
    23         this.id = id;
    24     }
    25 
    26     public String getName() {
    27         return name;
    28     }
    29 
    30     public void setName(String name) {
    31         this.name = name == null ? null : name.trim();
    32     }
    33 
    34     public Float getPrice() {
    35         return price;
    36     }
    37 
    38     public void setPrice(Float price) {
    39         this.price = price;
    40     }
    41 
    42     public String getPic() {
    43         return pic;
    44     }
    45 
    46     public void setPic(String pic) {
    47         this.pic = pic == null ? null : pic.trim();
    48     }
    49 
    50     public Date getCreatetime() {
    51         return createtime;
    52     }
    53 
    54     public void setCreatetime(Date createtime) {
    55         this.createtime = createtime;
    56     }
    57 
    58     public String getDetail() {
    59         return detail;
    60     }
    61 
    62     public void setDetail(String detail) {
    63         this.detail = detail == null ? null : detail.trim();
    64     }
    65 }
     

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

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

    ItemsController01.java的内容:

     
     1 package com.springmvc.controller;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import org.springframework.web.servlet.ModelAndView;
    10 import org.springframework.web.servlet.mvc.Controller;
    11 
    12 import com.springmvc.entity.Items;
    13 
    14 /**
    15  * 
    16  * @author 阿赫瓦里
    17  * @Description:实现controller接口的 处理器
    18  * 
    19  */
    20 public class ItemsController01 implements Controller {
    21 
    22     public ModelAndView handleRequest(HttpServletRequest req,
    23             HttpServletResponse res) throws Exception {
    24         //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
    25         List<Items> itemsList = new ArrayList<Items>();
    26         //向list中填充静态数据
    27         
    28         Items items_1 = new Items();
    29         items_1.setName("笔记本电脑");
    30         items_1.setPrice(6000f);
    31         items_1.setDetail("联想笔记本电脑");
    32         
    33         Items items_2 = new Items();
    34         items_2.setName("苹果手机");
    35         items_2.setPrice(5000f);
    36         items_2.setDetail("iphone6手机!");
    37         
    38         itemsList.add(items_1);
    39         itemsList.add(items_2);
    40 
    41         //返回ModelAndView
    42         ModelAndView modelAndView =  new ModelAndView();
    43         //相当 于request的setAttribut,在jsp页面中通过itemsList取数据
    44         modelAndView.addObject("itemsList", itemsList);
    45         //指定视图
    46         modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
    47 
    48         return modelAndView;
    49     }
    50 
    51 }
     

    8.视图jsp编写:itemsList.jsp

     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     4 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     6 <html>
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     9 <title>查询商品列表</title>
    10 </head>
    11 <body> 
    12 <form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
    13 查询条件:
    14 <table width="100%" border=1>
    15 <tr>
    16 <td><input type="submit" value="查询"/></td>
    17 </tr>
    18 </table>
    19 商品列表:
    20 <table width="100%" border="0">
    21 <tr>
    22     <td>商品名称</td>
    23     <td>商品价格</td>
    24     <td>生产日期</td>
    25     <td>商品描述</td>
    26     <td>操作</td>
    27 </tr>
    28 <c:forEach items="${itemsList }" var="item" >
    29 <tr>
    30     <td>${item.name }</td>
    31     <td>${item.price }</td>
    32     <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
    33     <td>${item.detail }</td>
    34     
    35     <td><a href="${pageContext.request.contextPath }/item/editItem.action?id=${item.id}">修改</a></td>
    36 
    37 </tr>
    38 </c:forEach>
    39 
    40 </table>
    41 </form>
    42 </body>
    43 
    44 </html>
     

    9.在springmvc.xml中配置handler

        将编写Handlerspring容器加载

    <!-- 配置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.非注解处理器适配器

     

     1 package com.springmvc.controller;
     2 
     3 import java.io.IOException;
     4 import java.util.ArrayList;
     5 import java.util.List;
     6 
     7 import javax.servlet.ServletException;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 import org.springframework.web.HttpRequestHandler;
    12 
    13 import com.springmvc.entity.Items;
    14 
    15 /**
    16  * 
    17  * @author 阿赫瓦里
    18  * @Description:实现HttpRequestHandler接口的 处理器
    19  * 
    20  */
    21 public class ItemsController02 implements HttpRequestHandler {
    22 
    23     public void handleRequest(HttpServletRequest req, HttpServletResponse resp)
    24             throws ServletException, IOException {
    25         //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
    26         List<Items> itemsList = new ArrayList<Items>();
    27         //向list中填充静态数据
    28         
    29         Items items_1 = new Items();
    30         items_1.setName("笔记本电脑");
    31         items_1.setPrice(6000f);
    32         items_1.setDetail("联想笔记本电脑");
    33         
    34         Items items_2 = new Items();
    35         items_2.setName("苹果手机");
    36         items_2.setPrice(5000f);
    37         items_2.setDetail("iphone6手机!");
    38         
    39         itemsList.add(items_1);
    40         itemsList.add(items_2);
    41         //设置模型数据
    42         req.setAttribute("itemsList", itemsList);
    43         //设置转发的视图
    44         req.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(req, resp);
    45         //使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
    46         /*
    47                 response.setCharacterEncoding("utf-8");
    48                 response.setContentType("application/json;charset=utf-8");
    49                 response.getWriter().write("json串");*/
    50     }
    51     
    52 }

     

      

     

    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)

     
     1 package com.springmvc.controller;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import org.springframework.stereotype.Controller;
     7 import org.springframework.web.bind.annotation.RequestMapping;
     8 import org.springframework.web.servlet.ModelAndView;
     9 
    10 import com.springmvc.entity.Items;
    11 
    12 /**
    13  * 
    14  * @author 阿赫瓦里
    15  * @Description:注解开发Handler
    16  * 
    17  */
    18 // 使用Controller标识 它是一个控制器
    19 @Controller
    20 public class ItemsController03 {
    21     // 商品查询列表
    22     // @RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
    23     // 一般建议将url和方法写成一样
    24     @RequestMapping("/queryItems")
    25     public ModelAndView queryItems() throws Exception {
    26         // 调用service查找 数据库,查询商品列表,这里使用静态数据模拟
    27         List<Items> itemsList = new ArrayList<Items>();
    28         // 向list中填充静态数据
    29 
    30         Items items_1 = new Items();
    31         items_1.setName("笔记本电脑");
    32         items_1.setPrice(6000f);
    33         items_1.setDetail("联想笔记本电脑");
    34 
    35         Items items_2 = new Items();
    36         items_2.setName("苹果手机");
    37         items_2.setPrice(5000f);
    38         items_2.setDetail("iphone6手机!");
    39 
    40         itemsList.add(items_1);
    41         itemsList.add(items_2);
    42         // 返回ModelAndView
    43         ModelAndView modelAndView = new ModelAndView();
    44         // 相当 于request的setAttribut,在jsp页面中通过itemsList取数据
    45         modelAndView.addObject("itemsList", itemsList);
    46 
    47         // 指定视图
    48         // 下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
    49         // modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
    50         // 上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
    51         modelAndView.setViewName("items/itemsList");
    52 
    53         return modelAndView;
    54     }
    55 }
     

    3.spring容器中加载Handler

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

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

    springmvc.xml中的全部内容:

     
     1 <beans xmlns="http://www.springframework.org/schema/beans"
     2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
     3     xmlns:context="http://www.springframework.org/schema/context"
     4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     6         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     7         http://www.springframework.org/schema/mvc 
     8         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
     9         http://www.springframework.org/schema/context 
    10         http://www.springframework.org/schema/context/spring-context-3.2.xsd 
    11         http://www.springframework.org/schema/aop 
    12         http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
    13         http://www.springframework.org/schema/tx 
    14         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
    15 
    16     <!-- 配置Handler -->
    17     <bean id="itemsController1" name="/queryItems_test1.action" class="com.springmvc.controller.ItemsController01" />
    18     <bean id="itemsController2" class="com.springmvc.controller.ItemsController02" />
    19     <!-- 对于注解的Handler可以单个配置
    20     实际开发中建议使用组件扫描
    21      -->
    22     <!-- <bean class="com.springmvc.controller.ItemsController3" /> -->
    23     <!-- 可以扫描controller、service、...
    24     这里让扫描controller,指定controller的包
    25      -->
    26     <context:component-scan base-package="com.springmvc.controller"></context:component-scan>
    27     
    28     
    29     
    30     <!-- 处理器映射器 -->
    31     <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
    32     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    33     
    34     <!-- 处理器适配器 所有处理器适配器都实现 HandlerAdapter接口 -->
    35     <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
    36     <!-- 另一个非注解的适配器 -->
    37     <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
    38     
    39     <!-- 注解映射器 -->
    40     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    41     <!-- 注解的适配器 -->
    42     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    43     <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
    44         mvc:annotation-driven默认加载很多的参数绑定方法,
    45         比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
    46         实际开发时使用mvc:annotation-driven
    47      -->
    48     <!-- <mvc:annotation-driven></mvc:annotation-driven> -->
    49     
    50     
    51         <!--简单url映射  -->
    52     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    53         <property name="mappings">
    54             <props>
    55                 <!-- 对itemsController1进行url映射,url是/queryItems1.action -->
    56                 <prop key="/queryItems1.action">itemsController1</prop>
    57                 <prop key="/queryItems2.action">itemsController1</prop>
    58                 <prop key="/queryItems3.action">itemsController2</prop>
    59             </props>
    60         </property>
    61     </bean>
    62     
    63     <!-- 视图解析器
    64             解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
    65      -->
    66     <bean
    67         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    68         <!-- 配置jsp路径的前缀 -->
    69         <property name="prefix" value="/WEB-INF/jsp/"/>
    70         <!-- 配置jsp路径的后缀 -->
    71         <property name="suffix" value=".jsp"/>
    72     </bean>
    73 </beans>
     

    项目工程目录:

    作者:阿赫瓦里
    本文以学习、研究和分享为主,版权归作者和博客园共有,欢迎转载,如果文中有不妥或者错误的地方还望大神您不吝指出。如果觉得本文对您有所帮助不如【推荐】一下吧!如果你有更好的建议,不如留言一起讨论,共同进步!

  • 相关阅读:
    用c语言程序判断谁是小偷
    android获取Button文本 从一个按钮开关中获取文本
    android 让一个控件按钮居于底部的几种方法
    java获取文件夹下所有文件的名称
    解决 apache error 指定网络名不再可用 "an unknown filter was not added: DEFLATE"的问题
    查看window隐藏进程,用微软的ProcessExplorer查看到电脑有个“硬件中断”占用大量CPU 解决办法
    Android中Message机制的灵活应用
    Thread和Looper以及Handler和Message详解 Android开发必读
    Android的Looper类使用的5个要点
    android的消息处理机制(图+源码分析)——Looper,Handler,Message
  • 原文地址:https://www.cnblogs.com/huangyangquan/p/8745933.html
Copyright © 2020-2023  润新知