首页 技术 正文
技术 2022年11月18日
0 收藏 837 点赞 4,326 浏览 9662 个字

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html

前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

1需求

以案例作为驱动。

SpringMVC和MyBatis使用一个案例(商品订单管理)。

功能需求:商品列表查询

2环境准备

数据库环境:mysql5.6

java环境:

jdk1.7

MyEclipse2014

SpringMVC版本:spring3.2

需要spring3.2所有jar(一定要包括spring-webmvc-3.2.0.RELEASE.jar)

新建一个web项目,将所需jar包拷贝至lib下。

3配置前端控制器

在web.xml中配置前端控制器。

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <display-name>SpringMVC</display-name>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>  <!-- 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随服务启动 -->      <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>      <servlet-name>springmvc</servlet-name>      <!--Servlet拦截方式          方式一:*.action,访问以.action结尾由DispatcherServlet进行解析          方式二:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析。          使用此方式可以实现RESTful风格的url          方式三:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,          仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错        -->      <url-pattern>*.action</url-pattern>  </servlet-mapping></web-app>

DispathcerServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties文件加载springmvc所用的各个组件,如果在springmvc.xml中配置了组件则以springmvc.xml中配置的为准,DispatcherServlet的存在降低了springmvc各各组件之间的耦合度。

4配置处理器适配器

在classpath下的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 ">    <!-- 处理器适配器           所有处理器适配器都实现HandlerAdapter接口     -->    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
</beans>

通过查看源码:

此适配器能执行实现Controller接口的Handler。

5开发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();        modelAndView.addObject("itemsList", itemsList);        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");        return modelAndView;    }}

6视图编写

创建/WEB-INF/jsp/order/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=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}" rel="external nofollow" >修改</a></td></tr></c:forEach></table></form></body></html>

7配置Handler

在spring容器中(springmvc.xml)加载编写的Handler。

    <!-- 配置Handler -->    <bean name="/queryItems.action" class="joanna.yan.ssm.controller.ItemsController1"/>

8配置处理器映射器

在classpath下的springmvc.xml中配置处理器映射器。

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

9配置视图解析器

需要在springmvc.xml中配置解析jsp的视图解析器。

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

10项目部署调试

将项目部署至Tomcat,访问http://localhost:8080/SpringMVC/queryItems.action

效果图:

从目前上面的代码来看,springmvc中一个类就一个方法,而struts中一个类可以写多个方法,很不方便。早期确实是这么干的,但是后来SpringMVC提倡用注解开发。

11.非注解的处理器映射器和适配器

11.1非注解的处理器映射器

前面我们配置的org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping是非注解的处理器映射器。这种映射器其实有一个问题就是要一个bean里面配置一个url。

现在我们再配置另一个非注解映射器

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,它会将url和handler集中进行配置。

    <!-- 配置Handler -->    <bean id="ItemsController1" name="/queryItems.action" class="joanna.yan.ssm.controller.ItemsController1"/>    <!-- 配置处理器映射器         将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)    -->    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>    <!-- 简单url映射         simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版,                  它可以将url和处理器bean的id进行统一映射配置。      -->      <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能让哪些映射器映射,就让正确的映射器处理。

11.2非注解的处理器适配器

前面我们配置的org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter是一个非注解的适配器。它要求你编写的Handler要实现Controller接口。

再说另一个非注解的适配器:

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter。它要求编写的Handler实现HttpRequestHandler接口。

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("iphone6苹果手机!");        itemsList.add(items_1);        itemsList.add(items_2);        //设置模型数据        request.setAttribute("itemsList", itemsList);        //设置转发的视图        request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);//        从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据://        response.setCharacterEncoding("utf-8");//        response.setContentType("application/json;charset=utf-8");//        response.getWriter().write("json串");    }}

在springmvc.xml中配置:

12.DispatcherServlet.properties

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

13.注解的处理器映射器和适配器

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

13.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> -->

13.2开发注解Handler

使用注解的映射器和注解的适配器。(注解的映射器和注解的适配器必须配对使用)

/** * 开发注解Handler * 使用@Controller标明它是一个控制器 * @author Joanna.Yan * */@Controllerpublic class ItemsController3{    //商品查询列表    //@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url    //一般建议将url和方法名写成一样,方便维护    @RequestMapping("/queryItems")    public ModelAndView queryItems() 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();        modelAndView.addObject("itemsList", itemsList);        //指定视图        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");        return modelAndView;    }    //定义其它方法    //商品添加    //商品修改}

13.3在spring容器中加载Handler

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

如果此文对您有帮助,微信打赏我一下吧~

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,997
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,511
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,356
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,139
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848