前面基本介绍了下SpringMVC的运行原理,现在按照前面的原理一步步实现一个简单的程序。先搭建一个简单的web工程,将spring的jar包导入项目中。

  • 前端控制器配置

  在web.xml中配置如下:

 <servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

  load-on-startup:表示servlet随服务启动;

  url-pattern:*.action的请交给DispatcherServlet处理。

  contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加载WEB-INF/[DispatcherServlet 的Servlet 名字]-servlet.xml。

  servlet拦截方法有如下注意点:

  1、拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action 此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

   2、拦截所有,设置为/,例如:/user/add  /user/add.action,此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

  3、拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

  • 配置处理器映射器

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

 <!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
  • 配置处理器适配器
 <!-- 处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
  • 开发hander
public class ItemList1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// 商品列表
List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items();
items_1.setName("技嘉笔记本");
items_1.setPrice(6000f);
items_1.setDetail("P35K V3笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6plus苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2);
// 创建modelAndView准备填充数据、设置视图
ModelAndView modelAndView = new ModelAndView();
// 填充数据
modelAndView.addObject("itemsList", itemsList);
// 视图
modelAndView.setViewName("order/itemsList");
return modelAndView;
}
}

  配置处理器

 <bean name="/items1.action" id="itemList1" class="com.luchao.controller.ItemList1"/>
  • 配置视图解析器
 <!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

  如果不使用视图解析器,那么上面控制器代码中需要指定具体的视图名称,如:modelAndView.setViewName("/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>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>商品描述</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td>${item.detail }</td>
</tr>
</c:forEach> </table>
</body>
</html>

  上面控制器实现了controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。并且上面的处理器映射器为org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,这是一种根据Url的名字找到处理器。如上:items1.action对应了com.luchao.controller.ItemList1这个处理类。

  另一种简单的处理器映射器:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping其配置如下:

  • 处理器映射器配置
 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/items1.action">itemList1</prop>
<prop key="/items2.action">itemList2</prop>
</props>
</property>
</bean>

  如果处理器实现了HttpRequestHandler,那么则需要使用org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter适配器。

  • 处理器适配器配置
 <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
  • 处理器代码
 public class ItemList2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 商品列表
List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items();
items_1.setName("技嘉笔记本");
items_1.setPrice(6000f);
items_1.setDetail("P35K V3笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6plus苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2);
// 填充数据
request.setAttribute("itemsList", itemsList);
//视图
request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);
}
}

  //使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据

 response.setCharacterEncoding("utf-8");

 response.setContentType("application/json;charset=utf-8");

 response.getWriter().write("json串");

  因为处理器有不同的实现,所以需要通过适配器来满足其处理的需求,这是一种适配器模式的经典实现。

  • 使用注解来实现

  注解处理器映射器和注解处理器适配器配置:

 <!--注解映射器 -->
<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代替上边注解映射器和注解适配器配置,mvc:annotation-driven默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter,实际开发时使用mvc:annotation-driven。

  另外还需要扫描包来加载处理器,配置如下:

 <!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->
<context:component-scan base-package="com.luchao.controller"/>
  • 处理器代码
 @Controller
public class ItemList3 {
// 商品查询列表
// @RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
// 一般建议将url和方法写成一样
@RequestMapping("/items3")
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("P35K V3笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6plus苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2); // 返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList); // 指定视图
modelAndView.setViewName("order/itemsList"); return modelAndView; }
}

  以上就是注解和非注解的几种实现,其实还可以根据实际需要来实现其他的处理器映射器和处理器适配器。

SpringMVC学习--入门程序的更多相关文章

  1. SpringMVC之入门程序

    SpringMVC之入门程序——使用浏览器展示商品数据 springMVC执行流程(图片来源:https://www.jianshu.com/p/8a20c547e245) 1.创建pojo(商品实体 ...

  2. springMVC Helloword 入门程序

    1  首先是在web.xml 中配置 <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-cl ...

  3. SpringMVC 学习-入门篇

    一.都需要哪些 Jar 包 <dependencies> <dependency> <groupId>org.springframework</groupId ...

  4. SpringMVC的入门程序

    1.环境准备(jar包) 2.在web.xml中配置前端控制器 <!-- springmvc 前端控制器 --> <servlet> <servlet-name>s ...

  5. SpringMVC学习(一)———— springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  6. springmvc(一) springmvc框架原理分析和简单入门程序

    springmvc这个框架真的非常简单,感觉比struts2还更简单,好好沉淀下来学习~ --WH 一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解 ...

  7. springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  8. SSM框架之SpringMVC(1)入门程序

    SpringMVC(1) 1.三层架构和MVC 1.1. 三层架构 咱们开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序 使用Java语言基本上都是开发B/S架构的程序,B ...

  9. SpringMVC-概述和入门程序

    三层架构和MVC B/S三层架构 表现层:web层,一般使用MVC模型 业务层:service层 持久层:dao层 MVC模型 Model:数据模型,JavaBean的类,用来进行数据封装 View: ...

随机推荐

  1. hihocoder #1388 : Periodic Signal NTT&FFT

    传送门:hihocoder #1388 : Periodic Signal 先来几个大牛传送门:  (模板) NTT long long 版 解法一:因为我们知道FFT会精度不够,所以坚持用NTT,但 ...

  2. sql中in和exists效率问题 转自百度知道

    in和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询 ...

  3. OAuth2学习及DotNetOpenAuth部分源码研究

    OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...

  4. Maven学习(一)安装 配置

    安装环境 windowXP 32 下载地址 http://maven.apache.org/download.cgi 安装包 apache-maven-3.2.3.zip 一.安装 Step1 解压缩 ...

  5. [No000015]坏习惯一大堆?别怕,还有救-坏习惯一堆,怎么好好学习嘛!

  6. 转: rapidJSON与jsoncpp语法说明

    转:  http://www.voidcn.com/blog/hudejun007/article/p-1811986.html

  7. fragment的切换(解决REPLACE的低效)

    在项目中切换Fragment,一直都是用replace()方法来替换Fragment.但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的 ...

  8. rstudio安装devtool出现“无法解析服务器的名称或地址”问题的解决

    问题:直接使用CRAN的源出现如下错误 Warning in install.packages : InternetOpenUrl failed: '无法解析服务器的名称或地址'Warning in ...

  9. HTML DOM Document 对象

    HTML DOM Document 对象 HTML DOM 节点 在 HTML DOM (Document Object Model) 中 , 每一个元素都是 节点: 文档是一个文档. 所有的HTML ...

  10. IIS Enabling HTTP Keep-Alives

    IIS 6.0 from:https://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea116535-8e ...