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. Django CBV与FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的 ...

  2. appium+python自动化29-toast

    注意 toast要appium1.6.3以上版本才支持,appium1.4的版本就别浪费时间了 Supported Platforms 1.查看appium v1.7版本官方文档 Supported ...

  3. 【UVA】1594 Ducci Sequence(纯模拟)

    题目 题目     分析 真的快疯了,中午交了一题WA了好久,最后发现最后一个数据不能加\n,于是这次学乖了,最后一组不输出\n,于是WA了好几发,最后从Udebug发现最后一组是要输出的!!!   ...

  4. Druid.io系列(二):基本概念与架构

    原文链接:  https://blog.csdn.net/njpjsoftdev/article/details/52955788 在介绍Druid架构之前,我们先结合有关OLAP的基本原理来理解Dr ...

  5. verilog 之数字电路 边沿检测电路

    由代码可知:此边沿检测电路是由两个触发器级联而成,sign_c_r 输出是sign_c_r2的输入.并且有异步复位端没有使能端.最后输出:由触发器的输出取反和直接输出相与.如下的RTL图.

  6. 数据库DRDS中间件介绍

    DRDS/TDDL alibaba. Distributed Relational Database Service. 阿里分布式数据库DRDS的前身是淘宝分布式数据库层TDDL,大概在2012年的时 ...

  7. 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  8. Django 的分页器

    from  不能发json格式   只能发四种格式 view from django.shortcuts import render,HttpResponse # Create your views ...

  9. ARP数据包伪造

      一台网络中的计算机,其传递到网络中的数据包的内容是完全由其软硬件逻辑决定的,软件可以操控硬件,硬件亦是一种特殊的软件,所以,接收者只根据数据包的内容,绝不可能判定此数据包的真正来源,一切都是可以伪 ...

  10. tornado 自定义session (一)

    tornado 中没有session功能,需要我们自己实现. 目录: settings: settings = { 'template_path': 'templates', 'static': 's ...