SpringMVC框架搭建配置方法及详解

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

现在主流的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配置(部分)

<!-- Spring MVC配置 -->
<!-- ====================================== -->
<servlet> 
  <servlet-name>spring</servlet-name> 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  <!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml 
  <init-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring-servlet.xml</param-value> 默认 
  </init-param> 
  -->
  <load-on-startup>1</load-on-startup> 
</servlet> 
 
<servlet-mapping> 
  <servlet-name>spring</servlet-name> 
  <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
  
 
 
<!-- Spring配置 -->
<!-- ====================================== -->
<listener> 
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
  
 
<!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->
<context-param> 
  <param-name>contextConfigLocation</param-name> 
  <param-value>classpath:config/applicationContext.xml</param-value> 
</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。

<xml version="1.0" encoding="UTF-8"> 
<beans xmlns="http://www.springframework.org/schema/beans"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"   
    xmlns:context="http://www.springframework.org/schema/context"   
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    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>"> 
 
  <!-- 启用spring mvc 注解 -->
  <context:annotation-config /> 
 
  <!-- 设置使用注解的类所在的jar包 -->
  <context:component-scan base-package="controller"></context:component-scan> 
 
  <!-- 完成请求和注解POJO的映射 -->
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 
 
  <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" /> 
</beans>

4. applicationContext.xml配置

<xml version="1.0" encoding="UTF-8"> 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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-2.5.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
 
  <!-- 采用hibernate.cfg.xml方式配置数据源 -->
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="configLocation"> 
      <value>classpath:config/hibernate.cfg.xml</value> 
    </property> 
  </bean> 
   
  <!-- 将事务与Hibernate关联 -->
  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
      <ref local="sessionFactory"/> 
    </property> 
  </bean> 
   
  <!-- 事务(注解 )-->
  <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 
 
  <!-- 测试Service -->
  <bean id="loginService" class="service.LoginService"></bean> 
 
  <!-- 测试Dao -->
  <bean id="hibernateDao" class="dao.HibernateDao"> 
    <property name="sessionFactory" ref="sessionFactory"></property> 
  </bean> 
</beans>

二、详解

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

package controller; 
 
import javax.servlet.http.HttpServletRequest; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
 
import entity.User; 
 
@Controller //类似Struts的Action 
public class TestController { 
 
  @RequestMapping("test/login.do") // 请求url地址映射,类似Struts的action-mapping 
  public String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) { 
    // @RequestParam是指请求url地址映射中必须含有的参数(除非属性required=false) 
    // @RequestParam可简写为:@RequestParam("username") 
 
    if (!"admin".equals(username) || !"admin".equals(password)) { 
      return "loginError"; // 跳转页面路径(默认为转发),该路径不需要包含spring-servlet配置文件中配置的前缀和后缀 
    } 
    return "loginSuccess"; 
  } 
 
  @RequestMapping("/test/login2.do") 
  public ModelAndView testLogin2(String username, String password, int age){ 
    // request和response不必非要出现在方法中,如果用不上的话可以去掉 
    // 参数的名称是与页面控件的name相匹配,参数类型会自动被转换 
     
    if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { 
      return new ModelAndView("loginError"); // 手动实例化ModelAndView完成跳转页面(转发),效果等同于上面的方法返回字符串 
    } 
    return new ModelAndView(new RedirectView("../index.jsp")); // 采用重定向方式跳转页面 
    // 重定向还有一种简单写法 
    // return new ModelAndView("redirect:../index.jsp"); 
  } 
 
  @RequestMapping("/test/login3.do") 
  public ModelAndView testLogin3(User user) { 
    // 同样支持参数为表单对象,类似于Struts的ActionForm,User不需要任何配置,直接写即可 
    String username = user.getUsername(); 
    String password = user.getPassword(); 
    int age = user.getAge(); 
     
    if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { 
      return new ModelAndView("loginError"); 
    } 
    return new ModelAndView("loginSuccess"); 
  } 
 
  @Resource(name = "loginService") // 获取applicationContext.xml中bean的id为loginService的,并注入 
  private LoginService loginService; //等价于spring传统注入方式写get和set方法,这样的好处是简洁工整,省去了不必要得代码 
 
  @RequestMapping("/test/login4.do") 
  public String testLogin4(User user) { 
    if (loginService.login(user) == false) { 
      return "loginError"; 
    } 
    return "loginSuccess"; 
  } 
}

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

package controller; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
 
@Controller
@RequestMapping("/test2/login.do") // 指定唯一一个*.do请求关联到该Controller 
public class TestController2 { 
   
  @RequestMapping
  public String testLogin(String username, String password, int age) { 
    // 如果不加任何参数,则在请求/test2/login.do时,便默认执行该方法 
     
    if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { 
      return "loginError"; 
    } 
    return "loginSuccess"; 
  } 
 
  @RequestMapping(params = "method=1", method=RequestMethod.POST) 
  public String testLogin2(String username, String password) { 
    // 依据params的参数method的值来区分不同的调用方法 
    // 可以指定页面请求方式的类型,默认为get请求 
     
    if (!"admin".equals(username) || !"admin".equals(password)) { 
      return "loginError"; 
    } 
    return "loginSuccess"; 
  } 
   
  @RequestMapping(params = "method=2") 
  public String testLogin3(String username, String password, int age) { 
    if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { 
      return "loginError"; 
    } 
    return "loginSuccess"; 
  } 
}

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

package controller; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
 
@Controller
@RequestMapping("/test3/*") // 父request请求url 
public class TestController3 { 
 
  @RequestMapping("login.do") // 子request请求url,拼接后等价于/test3/login.do 
  public String testLogin(String username, String password, int age) { 
    if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { 
      return "loginError"; 
    } 
    return "loginSuccess"; 
  } 
}

三、结束语

  掌握以上这些Spring MVC就已经有了很好的基础了,几乎可应对与任何开发,在熟练掌握这些后,便可更深层次的灵活运用的技术,如多种视图技术,例如 Jsp、Velocity、Tiles、iText 和 POI。Spring MVC框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。

 
标签: Spring MVC 框架搭建
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Springboot + mybatis + React+redux+React-rou
    前言:            后台搭建完以后开始搭建前端,使用create-react-app搭建项目非常方便。           前端主要是如何向后台请求数据,以及如何使用redux管理state,路由的配置.           前端github地址:  https://github.com
    02-09
  • 这个Spring Security登录插件牛啊,验证码、小程序、OAuth2都能快速接入
    这个Spring Security登录插件牛啊,验证码、小
    上次我们把验证码登录、小程序登录优雅地集成到了Spring Security,很多同学大呼过瘾,相比较一些传统玩法高级了很多。胖哥就赶紧抓住机会举一反三,把几个非标准的OAuth2也接入了进来,主要是微信、企业微信,做到应接尽接。只需要通过下面几行简单的代码就
    02-09 java
  • 微信小程序获取openId  SpringBoot
    微信小程序获取openId SpringBoot
    官方文档wx.login:【穿梭门】https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.htmlauth.code2Session【穿梭门】https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html案例小
    02-09
  • 微信小程序 springboot nginx 做图片存储 上传
    微信小程序前端-springboot后端-nginx图片存储前言本人小白一名,这是第一次学习微信小程序,特此做个记录。首先准备nginx做图片存储选择一个地址存放图片#我的地址[root@VM_0_16_centos images]# pwd/home/photos/images[root@VM_0_16_centos images]#然后配
    02-09
  • Ruby中文乱码问题 springmvc中文乱码
    中文乱码问题解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*-(EMAC写法) 或者 #coding=utf-8 就行了。源代码文件中,若包含中文编码,则需要注意两点:1. 必须在首行添加 # -*- coding: UTF-8 -*-,告诉解释器使用utf-8来解析源码。2. 必须设置编
    02-09
  • SpringBoot + nodeJS + zookeeper 搭建微服务示
    总体来说该项目由服务注册 + 服务发现 + 服务代理 + 服务调用四部分组成。使用java客户的开发服务注册组件,它是整个微服务架构中的服务注册表,使用Node.js客户端开发服务发现组件,它用于在服务注册表中根据具体的服务名称获取对应的服务配置。  由项目1
    02-09
  • Spring注解与P/C命名空间超详细解析
    目录注解实现自动装配@Autowire注解@Qualifier注解@Resource注解@Component@Scope@ComponentScan@Bean@Configuration@ValueP命名空间注入C命名空间注入Spring开发包名解释Java方式配置注解实现自动装配@Autowire注解@Autowire注解,自动装配通过类型,名字如
  • SpringBoot使用过滤器、拦截器和监听器的案例代
    目录SpringBoot使用过滤器、拦截器和监听器一、SpringBoot使用过滤器Spring boot过滤器的使用(两种方式)方式一:方式二:二、SpringBoot使用拦截器三、过滤器和拦截器的执行顺序四、SpringBoot使用监听器1、统计网站最多在线人数监听器的例子2、springboot
  • 一个C#开发者学习SpringCloud搭建微服务的心路历程
    一个C#开发者学习SpringCloud搭建微服务的心路
    前言Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘。SpringCloud是封装了Netflix公司开发的Eureka模块来实现服务注册和发现。下图为Sp
    02-09
  • 微信小程序 部署(后台是springboot项目  前后台分离)
    微信小程序 部署(后台是springboot项目 前后
     微信小程序的部署需要https 和证书:   https 需要反向代理:   这里用 nginx,无论linux,windows 系统都可以安装:1.安装nginx ,这步自己去做;   linux 安装nginx 可以使用宝塔,或自己下载安装;2.配置nginx,把证书放在nginx安装目录conf 文件
    02-09
点击排行