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. 【CSS】文字超出显示省略号&连续字符换行

    方法1.多行控制(css3) .text { width: 100%; word-break: break-all; display: -webkit-box; -webkit-line-clamp: ...

  2. java web 程序---猜数字游戏的猜了多少次的代码

    思路:用setAttribute()放 ,然后直接输出 Integer str=(Integer)session.getAttribute("count"); int num3= ...

  3. Thread之五:线程的优先级

    Java线程可以有优先级的设定,高优先级的线程比低优先级的线程有更高的几率得到执行(不完全正确,请参考下面的“线程优先级的问题“). 记住当线程的优先级没有指定时,所有线程都携带普通优先级. 优先级可 ...

  4. JS实战应用之做LOL领图标任务~

    说一个技术造福人类的故事,事情是这样的,我是英雄联盟的忠实玩家,在浏览官网的时候看到这样一个活动(http://lol.qq.com/act/a20161020teemo/index.html),有个 ...

  5. mac 使用svn记录

    checkout  project : svn checkout svn://127.0.0.1/repository --username=username --password=password ...

  6. Log4j记录日志使用方法

    1.导入相关JAR包 log4j-1.2.15.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar log4jdbc4-1.2.jar 2.配置log4j. ...

  7. Tkinter Text(文本)

         Tkinter Text(文本): 文本小部件提供先进的功能,让您编辑多行文本格式,如改变其颜色和字体的方式显示.   文本小部件提供先进的功能,让您编辑多行文本格式,如改变其颜色和字体的方 ...

  8. [转] C#-using用法详解

    转载自 WanderOCN的文章 C#-using用法详解 using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型. (二).作为语句,用于定义一个 ...

  9. 使用Tor创建.onion域名网站(创建暗网服务和暗网的网站)

    使用Tor 的.onion域名创建匿名服务器 Tor不仅可以提供客户端的匿名访问,Tor还可以提供服务器的匿名.通过使用Tor网络,用户可以维护位置不可知的服务器.当然如果要访问这个隐蔽的服务,客户端 ...

  10. 打开当前目录的其他exe

    STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, , sizeof(si)); si.cb = sizeof(STARTUPINFO); ...