spring MVC配置详解

现在主流的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包

SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。

DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherServlet的,那么我们先来配置一下DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在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>&nbsp; 默认     </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>    <listenerclass>      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>

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>

DispatcherServlet会利用一些特殊的bean来处理Request请求和生成相应的视图返回。

关于视图的返回,Controller只负责传回来一个值,然后到底返回的是什么视图,是由视图解析器控制的,在jsp中常用的视图解析器是InternalResourceViewResovler,它会要求一个前缀和一个后缀

在上述视图解析器中,如果Controller返回的是blog/index,那么通过视图解析器解析之后的视图就是/jsp/blog/index.jsp。

主要是说说Controller.

一个类使用了@Controller进行标记的都是Controller

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";     } }

在SpringMVC中常用的注解还有@PathVariable,@RequestParam,@PathVariable标记在方法的参数上,利用它标记的参数可以利用请求路径传值,看下面一个例子

@RequestMapping(value="/comment/{blogId}", method=RequestMethod.POST) public void comment(Comment comment,@PathVariable int blogId, HttpSession session, HttpServletResponse response) throws IOException {      }

在该例子中,blogId是被@PathVariable标记为请求路径变量的,如果请求的是/blog/comment/1.do的时候就表示blogId的值为1. 同样@RequestParam也是用来给参数传值的,但是它是从头request的参数里面取值,相当于request.getParameter("参数名")方法。

在Controller的方法中,如果需要WEB元素HttpServletRequest,HttpServletResponse和HttpSession,只需要在给方法一个对应的参数,那么在访问的时候SpringMVC就会自动给其传值,但是需要注意的是在传入Session的时候如果是第一次访问系统的时候就调用session会报错,因为这个时候session还没有生成。

SpringMVC 2.5.6 +Hibernate 3.2.0的更多相关文章

  1. SpringMVC,Spring,Hibernate,Mybatis架构开发搭建之SpringMVC部分

    SpringMVC,Spring,Hibernate,Mybatis架构开发搭建之SpringMVC部分 辞职待业青年就是有很多时间来写博客,以前在传统行业技术强度相对不大,不处理大数据,也不弄高并发 ...

  2. springMVC,spring和Hibernate整合(重要)

    springMVC,spring和Hibernate整合 https://my.oschina.net/hugohxb/blog/184715 第一步:搭建一个springmvc工程,需要的jar有: ...

  3. hibernate jpa 2.0 报错Hibernate cannot unwrap interface java.sql.Connection

    今天在做报表的时候,利用Hibernate JPA 2.0需要获取数据库连接com.sql.Connection的时候获取不到,网上说用这种方式解决: entityManager.getTransac ...

  4. Hibernate Validator 6.0.9.Final - JSR 380 Reference Implementation: Reference Guide

    Preface Validating data is a common task that occurs throughout all application layers, from the pre ...

  5. springmvc配置mybatis与hibernate的不同点

    相信每个人对springmvc+hibernate或者springmvc+mybatis都不会陌生,拿来一个项目也都会开发.但是自己配置的情况下却很少,即使自己配置过,长时间不写也会忘,在这里记录一下 ...

  6. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

  7. SpringMVC+Apache Shiro+JPA(hibernate)

    http://my.oschina.net/moziqi/blog/305412 http://my.oschina.net/miger/blog/283526 spring4.1.0+spring ...

  8. spring整合springMVC、mybatis、hibernate、mongodb框架

    开发环境 eclipse Mars 4.5 JDK 1.7 框架 spring 4.0.5 mybatis 3.2.7 hibernate 4.3.6 mongodb 1.7 数据库 MySQL 5. ...

  9. STS 3.6.4 SpringMVC 4.1.6 Hibernate 4.3.8 MySQL

    开发环境: Java 1.8 Spring Tool Suite 3.6.4 Spring faramework 4.1.6 Hibernate 4.3.8 Maven 2.9 数据库是MySQL 5 ...

随机推荐

  1. Hibernate学习9—检索策略

    本章,采用Class和Student     ——  1 对 多的关系: Student.java: package com.cy.model; public class Student { priv ...

  2. 分布式事务之:TCC几个框架的测试情况记录

    国内主要的开源TCC分布式事务框架包括 框架名称 Github地址  star数量  tcc-transaction  https://github.com/changmingxie/tcc-tran ...

  3. .NET单点登录实现方法----两种

    第一种模式:同一顶级域名下cookie共享,代码如下 HttpCookie cookies = new HttpCookie("Token"); cookies.Expires = ...

  4. 第六章 通过Service访问Pod(中)

    6.2 Cluster IP 底层实现 Cluster IP 是一个虚拟IP,是由K8s节点上的iptables规则管理的. 使用类似轮询的方法访问Pod. 6.3 DNS 访问Service 在Cl ...

  5. 【洛谷】P1095 守望者的逃离(递推)

    题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...

  6. DynamicConverter

    folly/DynamicConverter.h When dynamic objects contain data of a known type, it is sometimes useful t ...

  7. JAVA for循环语句的循环变量类型问题

    class HalfDollars { public static void main(String [] arguments) { int[] denver = {1_900_000,1_700_0 ...

  8. jdk ssl证书

  9. zoj-3433-Gu Jian Qi Tan

    /* Gu Jian Qi Tan -------------------------------------------------------------------------------- T ...

  10. Centos内核参数

    内核参数 abi.vsyscall32 = 1  在2.6.25版本以后的x86-64内核中,默认启用了VDSO32. 虚拟动态共享对象 http://man7.org/linux/man-pages ...