spring mvc 框架搭建及详解

2023-10-28

原文地址:http://blog.csdn.net/wangpeng047/article/details/6983027


现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。

  一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0)

  1. jar包引入

  Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jar

  Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar包

  2. web.xml配置(部分)

[html]  view plain copy
  1. <!-- Spring MVC配置 -->  
  2. <!-- ====================================== -->  
  3. <servlet>  
  4.     <servlet-name>spring</servlet-name>  
  5.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  6.     <!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml  
  7.     <init-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>/WEB-INF/spring-servlet.xml</param-value>  默认  
  10.     </init-param>  
  11.     -->  
  12.     <load-on-startup>1</load-on-startup>  
  13. </servlet>  
  14.   
  15. <servlet-mapping>  
  16.     <servlet-name>spring</servlet-name>  
  17.     <url-pattern>*.do</url-pattern>  
  18. </servlet-mapping>  
  19.     
  20.   
  21.   
  22. <!-- Spring配置 -->  
  23. <!-- ====================================== -->  
  24. <listener>  
  25.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  26. </listener>  
  27.     
  28.   
  29. <!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->  
  30. <context-param>  
  31.     <param-name>contextConfigLocation</param-name>  
  32.     <param-value>classpath:config/applicationContext.xml</param-value>  
  33. </context-param>  

  3. spring-servlet.xml配置

  spring-servlet这个名字是因为上面web.xml中<servlet-name>标签配的值为spring(<servlet-name>spring</servlet-name>),再加上“-servlet”后缀而形成的spring-servlet.xml文件名,如果改为springMVC,对应的文件名则为springMVC-servlet.xml。

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"       
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"       
  4.         xmlns:context="http://www.springframework.org/schema/context"       
  5.    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  6.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     
  7.        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd     
  8.        http://www.springframework.org/schema/context <a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd">http://www.springframework.org/schema/context/spring-context-3.0.xsd</a>">  
  9.   
  10.     <!-- 启用spring mvc 注解 -->  
  11.     <context:annotation-config />  
  12.   
  13.     <!-- 设置使用注解的类所在的jar包 -->  
  14.     <context:component-scan base-package="controller"></context:component-scan>  
  15.   
  16.     <!-- 完成请求和注解POJO的映射 -->  
  17.     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  18.   
  19.     <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->  
  20.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" />  
  21. </beans>  

  4. applicationContext.xml配置

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:aop="http://www.springframework.org/schema/aop"  
  5.         xmlns:tx="http://www.springframework.org/schema/tx"  
  6.         xsi:schemaLocation="  
  7.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  9.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  10.   
  11.     <!-- 采用hibernate.cfg.xml方式配置数据源 -->  
  12.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  13.         <property name="configLocation">  
  14.             <value>classpath:config/hibernate.cfg.xml</value>  
  15.         </property>  
  16.     </bean>  
  17.       
  18.     <!-- 将事务与Hibernate关联 -->  
  19.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  20.         <property name="sessionFactory">  
  21.             <ref local="sessionFactory"/>  
  22.         </property>  
  23.     </bean>  
  24.       
  25.     <!-- 事务(注解 )-->  
  26.     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>  
  27.   
  28.    <!-- 测试Service -->  
  29.    <bean id="loginService" class="service.LoginService"></bean>  
  30.   
  31.     <!-- 测试Dao -->  
  32.     <bean id="hibernateDao" class="dao.HibernateDao">  
  33.         <property name="sessionFactory" ref="sessionFactory"></property>  
  34.     </bean>  
  35. </beans>  

 

  二、详解

  Spring MVC与Struts从原理上很相似(都是基于MVC架构),都有一个控制页面请求的Servlet,处理完后跳转页面。看如下代码(注解):

[java]  view plain copy
  1. package controller;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.RequestParam;  
  8.   
  9. import entity.User;  
  10.   
  11. @Controller  //类似Struts的Action  
  12. public class TestController {  
  13.   
  14.     @RequestMapping("test/login.do")  // 请求url地址映射,类似Struts的action-mapping  
  15.     public String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) {  
  16.         // @RequestParam是指请求url地址映射中必须含有的参数(除非属性required=false)  
  17.         // @RequestParam可简写为:@RequestParam("username")  
  18.   
  19.         if (!"admin".equals(username) || !"admin".equals(password)) {  
  20.             return "loginError"// 跳转页面路径(默认为转发),该路径不需要包含spring-servlet配置文件中配置的前缀和后缀  
  21.         }  
  22.         return "loginSuccess";  
  23.     }  
  24.   
  25.     @RequestMapping("/test/login2.do")  
  26.     public ModelAndView testLogin2(String username, String password, int age){  
  27.         // request和response不必非要出现在方法中,如果用不上的话可以去掉  
  28.         // 参数的名称是与页面控件的name相匹配,参数类型会自动被转换  
  29.           
  30.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  31.             return new ModelAndView("loginError"); // 手动实例化ModelAndView完成跳转页面(转发),效果等同于上面的方法返回字符串  
  32.         }  
  33.         return new ModelAndView(new RedirectView("../index.jsp"));  // 采用重定向方式跳转页面  
  34.         // 重定向还有一种简单写法  
  35.         // return new ModelAndView("redirect:../index.jsp");  
  36.     }  
  37.   
  38.     @RequestMapping("/test/login3.do")  
  39.     public ModelAndView testLogin3(User user) {  
  40.         // 同样支持参数为表单对象,类似于Struts的ActionForm,User不需要任何配置,直接写即可  
  41.         String username = user.getUsername();  
  42.         String password = user.getPassword();  
  43.         int age = user.getAge();  
  44.           
  45.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  46.             return new ModelAndView("loginError");  
  47.         }  
  48.         return new ModelAndView("loginSuccess");  
  49.     }  
  50.   
  51.     @Resource(name = "loginService")  // 获取applicationContext.xml中bean的id为loginService的,并注入  
  52.     private LoginService loginService;  //等价于spring传统注入方式写get和set方法,这样的好处是简洁工整,省去了不必要得代码  
  53.   
  54.     @RequestMapping("/test/login4.do")  
  55.     public String testLogin4(User user) {  
  56.         if (loginService.login(user) == false) {  
  57.             return "loginError";  
  58.         }  
  59.         return "loginSuccess";  
  60.     }  
  61. }  

  以上4个方法示例,是一个Controller里含有不同的请求url,也可以采用一个url访问,通过url参数来区分访问不同的方法,代码如下:

[java]  view plain copy
  1. package controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.RequestMethod;  
  6.   
  7. @Controller  
  8. @RequestMapping("/test2/login.do")  // 指定唯一一个*.do请求关联到该Controller  
  9. public class TestController2 {  
  10.       
  11.     @RequestMapping  
  12.     public String testLogin(String username, String password, int age) {  
  13.         // 如果不加任何参数,则在请求/test2/login.do时,便默认执行该方法  
  14.           
  15.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  16.             return "loginError";  
  17.         }  
  18.         return "loginSuccess";  
  19.     }  
  20.   
  21.     @RequestMapping(params = "method=1", method=RequestMethod.POST)  
  22.     public String testLogin2(String username, String password) {  
  23.         // 依据params的参数method的值来区分不同的调用方法  
  24.         // 可以指定页面请求方式的类型,默认为get请求  
  25.           
  26.         if (!"admin".equals(username) || !"admin".equals(password)) {  
  27.             return "loginError";  
  28.         }  
  29.         return "loginSuccess";  
  30.     }  
  31.       
  32.     @RequestMapping(params = "method=2")  
  33.     public String testLogin3(String username, String password, int age) {  
  34.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  35.             return "loginError";  
  36.         }  
  37.         return "loginSuccess";  
  38.     }  
  39. }  

  其实RequestMapping在Class上,可看做是父Request请求url,而RequestMapping在方法上的可看做是子Request请求url,父子请求url最终会拼起来与页面请求url进行匹配,因此RequestMapping也可以这么写:

[java]  view plain copy
  1. package controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. @Controller  
  7. @RequestMapping("/test3/*")  // 父request请求url  
  8. public class TestController3 {  
  9.   
  10.     @RequestMapping("login.do")  // 子request请求url,拼接后等价于/test3/login.do  
  11.     public String testLogin(String username, String password, int age) {  
  12.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  13.             return "loginError";  
  14.         }  
  15.         return "loginSuccess";  
  16.     }  
  17. }  

 

   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring mvc 框架搭建及详解 的相关文章

  • 在java代码中创建postgresql表

    我有一个与 postgreSQL 数据库连接的 java 代码 现在 我希望当它连接到数据库时 我还将创建数据库表 但我的问题是 它不会创建数据库 我不知道问题是什么 这是我的代码 Statement st null ResultSet r
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • Java:一种将 Mime(内容)类型与 CommonsMultipartFile 中的文件扩展名相匹配的方法

    在我的公司 出于额外原因 我需要将 mime 类型与文件扩展名进行比较 我有一个CommonsMultipartFile 我正在尝试找出进行这种比较的最佳方法 我见过一个MimetypesFileTypeMap 但不确定这是否适用于此 我试
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • Spring 从 JBoss 上下文加载 PropertySourcesPlaceholderConfigurer

    我有一个使用 PropertySourcesPlaceholderConfigurer 的 spring 3 1 应用程序加载设置 我想管理测试和生产环境 只需从服务器上下文加载设置覆盖本地文件属性中指定的设置 下一个示例在 Tomcat
  • Google 表格使用 API 密钥而不是 client_secret.json

    In the QuickStart java示例Java 快速入门 https developers google com sheets api quickstart java他们使用OAuth client ID识别该应用程序 这会弹出一
  • java彩色滚动条搜索结果

    我将如何在 Java 中自定义滚动条 以便我可以进行像 chrome 一样的搜索 也就是说在结果所在的位置放置彩色条纹 我不想要一个库 因为我更喜欢自己编写代码 另外 我不想失去我拥有的 L F 欢迎举例 实际上 它将查看一个大的文本文件或
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • Hybris:如何在impex中导入zip文件中的媒体?

    我知道我们可以导入未像这样压缩的图像 siteResource jar com project initialdata constants ProjectInitialDataConstants projectinitialdata imp
  • 在 Spring MVC 中将请求写入文件

    我希望能够将整个请求写入 Spring MVC 控制器中的文件 我已尝试以下操作 但即使我使用大量参数发出 POST 请求 文件也始终为空 RequestMapping method RequestMethod POST value pay
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • 如何更改 JAX-WS Web 服务的地址位置

    我们目前已经公开了具有以下 URL 的 JAX RPC Web 服务 http xx xx xx xx myservice MYGatewaySoapHttpPort wsdl http xx xx xx xx myservice MYGa
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy

随机推荐

  • TCP/IP协议栈模型分析

    一 TCP IP协议 标准TCP IP协议是用于计算机通信的一组协议 通常被称为TCP IP协议栈 以它为基础组建的互联网是目前国际上规模最大的计算机网络 正因为互联网的广泛应用 使得TCP IP成为了事实上的网络标准 TCP IP传输协议
  • 大数据——Java 知识点整理

    1 JDK 和 JRE 有什么区别 JDK Java Development Kit 的简称 java开发工具包 提供了java的开发环境和运行环境 JRE Java Runtime Environment 的简称 java运行环境 为ja
  • Java是未来的第一编程语言吗?

    点击上方 程序员小乐 关注 星标或置顶一起成长 每天凌晨00点00分 第一时间与你相约 每日英文 Thinking too much of others makes you nothing in their eyes 把别人看得太重 结果在
  • OpenLayers标记地图点及点击地图点显示自定义弹出框

    css代码 设置弹出框样式 设置弹出框样式 ol popup position absolute background color eeeeee webkit filter drop shadow 0 1px 4px rgba 0 0 0
  • 华为OD机试 Python 【符合要求的元组的个数】

    题目 你有一个整数列表和一个目标数字 你的任务是找出这个列表里有多少种方式 组合 使得其中的k个数字加起来等于那个目标数字 列表中的数字个数介于2到200之间 列表中的每个数字和目标数字都在 109到109之间 k的值介于2到100之间 举
  • CentOS7 NodeJS源码安装

    CentOS 版本 root localhost test cat etc redhat release CentOS Linux release 7 5 1804 Core 下载NodeJS源码 root localhost test w
  • VS2013 配置CUDA

    一 环境 Windows10家庭版 64位 Virtual Stadio 2013 CUDA 8 0 二 工程建立 1 打开vs2013并创建一个空win32程序 创建一个cuda samples的解决方案和cuda test1项目 2 右
  • 天线工作原理以及如何计算天线长度

    一 题记 人们的生活离不开手机 手机离不开无线通信 在家我们可以连接路由器 在外我们可以连接基站 不可否认的是我们的手机都是通过无线电波与路由器或者基站的天线相连接 见过很多天线 有室外的 有室内的 有长的 有方的 还有圆的 天线的各种形状
  • 【js】js 中{},[]中括号,大括号使用详解

    大括号 表示定义一个对象 大部分情况下要有成对的属性和值 或是函数 一 大括号 表示定义一个对象 大部分情况下要有成对的属性和值 或是函数 如 var LangShen Name Langshen AGE 28 上面声明了一个名为 Lang
  • [Qt 教程之开始的开始] —— qrc资源文件介绍与使用

    Qt系列教程总目录 Qt工程分组中 除了Headers Sources Forms外 还有一个文件夹Resources 只有当工程中有图片 音频等资源文件时才会用到 首先将资源文件存放到工程目录下的文件夹中 然后添加 qrc文件 方法如下
  • Python3安装完全攻略 Mac篇

    前言 mac系统自带python 不过以当前mac系统的最新版本为例 自带的python版本都是2 X版本 虽然不影响老版本项目的运行 但是python最新的3 X版本的一些语法与2 X版本并不相同 网上的教程大神们也肯定都更新出了最新版的
  • LAN8720网卡掉线

    前提概念 差分线 网线输入输出分别由两条差分线构成 阻抗特性 再高速网络信号中 PCB走线需要达到指定的阻抗值 网线阻抗值 100ohm
  • Application.mk 向源代码传递宏定义

    在看cocos2dx代码时 经常看到 if defined COCOS2D DEBUG COCOS2D DEBUG gt 0 或者 if COCOS2D DEBUG gt 0 但是在源文件中又没有看到在那里定义 网上搜索了一下 发现是在Ap
  • 图像中二维码的检测和定位

    二维码 二维条码 二维码 2 dimensional bar code 是用某种特定的几何图形按一定规律在平面 二维方向上 分布的黑白相间的图形记录数据符号信息的 在代码编制上巧妙地利用构成计算机内部逻辑基础的 0 1 比特流的概念 使用若
  • 表面肌电信号处理流程——基于肌电信号分类的特征抽取的设计

    如图为表面肌电信号研究的一般流程 仅作参考 本文中主要在特征提取方面进行研究 动动小手指 帮我投上一票 摄影比赛 复制链接在微信搜索框打开哦 http h5 3431373334 hflw0tq cn app rWVzkuCTZg play
  • 安卓改透明屏有哪些方法和步骤?壁纸、主题、软件

    安卓改透明屏是指将安卓手机的屏幕背景变为透明 使得手机的背景图像或者壁纸能够透过屏幕显示出来 这样的改变可以让手机的界面更加个性化 也能够增加手机的美观度 要实现安卓手机的透明屏 可以通过以下几种方法 1 使用透明壁纸 在安卓手机的壁纸设置
  • 无法打开包括文件: “ui_XXX.h”: No such file or directory

    切换到Qmake 移除ui文件 h文件 cpp文件 重新添加到项目中去 会自动生成
  • 安装MySQL 失败 服务无法启动

    转载自 39条消息 Win11安装mysql 服务无法启动 1053错误之解决方法 为什么win11安装不了mysql 1丶MI的博客 CSDN博客 创建mysql服务时 系统已提示创建服务成功 但是net start mysql命令提示启
  • Azkaban-开源任务调度程序(使用篇)

    上篇文章说到了安装 这次说说使用 登录 https localhost 8443 注意是https 采用的是jetty ssl链接 输入账号密码azkaban azkanban 如果你之前没有更改的话 首页 首页有四个菜单 projects
  • spring mvc 框架搭建及详解

    原文地址 http blog csdn net wangpeng047 article details 6983027 现在主流的Web MVC框架除了Struts这个主力 外 其次就是Spring MVC了 因此这也是作为一名程序员需要掌