Spring MVC 3.0 深入及对注解的详细讲解 .

目录(?)[-]
  1. 核心原理
  2. spring30中相关jar包的含义
  3. Controller控制器定义
  4. RequestMapping
  5. RequestParam
  6. SessionAttributes
  7. ModelAttribute
  8. Controller类中方法参数的处理
  9. Controller类中方法返回值的处理
  10. 请求转发和重定向
  11. 获得request对象session对象
  12. ModelMap
  13. ModelAndView模型视图类

 

 

核心原理

1.       用户发送请求给服务器。urluser.do

2.       服务器收到请求。发现Dispatchservlet可以处理。于是调用DispatchServlet

3.      DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller

4、    Control开始执行

5.      Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。

6.      DispatchServlet将执视图对象中的数据,输出给服务器。

7.      服务器将数据输出给客户端。

spring3.0中相关jar包的含义

org.springframework.aop-3.0.3.RELEASE.jar

springaop面向切面编程

org.springframework.asm-3.0.3.RELEASE.jar

spring独立的asm字节码生成程序

org.springframework.beans-3.0.3.RELEASE.jar

IOC的基础实现

org.springframework.context-3.0.3.RELEASE.jar

IOC基础上的扩展服务

org.springframework.core-3.0.3.RELEASE.jar

spring的核心包

org.springframework.expression-3.0.3.RELEASE.jar

spring的表达式语言

org.springframework.web-3.0.3.RELEASE.jar

web工具包

org.springframework.web.servlet-3.0.3.RELEASE.jar

mvc工具包

@Controller控制器定义

Struts1一样,SpringControllerSingleton的。这就意味着会被多个请求线程共享。因此,我们将控制器设计成无状态类。

 

spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为controllerbean,需要在spring-context配置文件中增加如下定义:

 

base-package="com.sxt.web"/>

 

注:实际上,使用@component,也可以起到@Controller同样的作用。

@RequestMapping

 

    在类前面定义,则将url和类绑定。

   在方法前面定义,则将url和类的方法绑定

@RequestParam

         一般用于将指定的请求参数付给方法中形参。示例代码如下:

        

@RequestMapping(params="method=reg5")

    public String reg5(@RequestParam("name")String uname,ModelMap map) {

       System.out.println("HelloController.handleRequest()");

       System.out.println(uname);

       return"index";

    }

   这样,就会将name参数的值付给uname。当然,如果请求参数名称和形参名称保持一致,则不需要这种写法。

@SessionAttributes

    ModelMap中指定的属性放到session中。示例代码如下:

   

@Controller

@RequestMapping("/user.do")

@SessionAttributes({"u","a"})  //ModelMap中属性名字为ua的再放入session中。这样,requestsession中都有了。

publicclass UserController {

    @RequestMapping(params="method=reg4")

    public String reg4(ModelMap map) {        System.out.println("HelloController.handleRequest()");

       map.addAttribute("u","uuuu"); //u放入request作用域中,这样转发页面也可以取到这个数据。

       return"index";

    }

}

  <body>

   <h1>**********${requestScope.u.uname}h1>

   <h1>**********${sessionScope.u.uname}h1>

  body>

   

    注:名字为”user”的属性再结合使用注解@SessionAttributes可能会报错。

 

@ModelAttribute

     这个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap中属性的值通过该注解自动赋给指定变量。

    示例代码如下:

package com.sxt.web;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.SessionAttributes;

@Controller

@RequestMapping("/user.do")

@SessionAttributes({"u","a"}) 

publicclass UserController {

   

    @RequestMapping(params="method=reg4")

    public String reg4(ModelMap map) {

       System.out.println("HelloController.handleRequest()");

       map.addAttribute("u","尚学堂高淇");

       return"index";

    }

   

    @RequestMapping(params="method=reg5")

public String reg5(@ModelAttribute("u")String uname ,ModelMap map) {

       System.out.println("HelloController.handleRequest()");

       System.out.println(uname);

       return"index";

    }

   

}

 

先调用reg4方法,再调用reg5方法。 

Controller类中方法参数的处理

 

Controller类中方法返回值的处理

1.       返回string(建议)

a)         根据返回值找对应的显示页面。路径规则为:prefix前缀+返回值+suffix后缀组成

b)         代码如下:

@RequestMapping(params="method=reg4")

    public String reg4(ModelMap map) {

       System.out.println("HelloController.handleRequest()");

       return"index";

    }

前缀为:/WEB-INF/jsp/   后缀是:.jsp

在转发到:/WEB-INF/jsp/index.jsp

 

2.       也可以返回ModelMapModelAndViewmapListSetObject、无返回值。一般建议返回字符串!

 

请求转发和重定向

         代码示例:

        

package com.sxt.web;

 

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.SessionAttributes;

 

@Controller

@RequestMapping("/user.do")

publicclass UserController {

   

    @RequestMapping(params="method=reg4")

    public String reg4(ModelMap map) {

       System.out.println("HelloController.handleRequest()");

//     return "forward:index.jsp";

//     return "forward:user.do?method=reg5"; //转发

//     return "redirect:user.do?method=reg5";  //重定向

       return"redirect:http://www.baidu.com"//重定向

    }

   

    @RequestMapping(params="method=reg5")

    public String reg5(String uname,ModelMap map) {

       System.out.println("HelloController.handleRequest()");

       System.out.println(uname);

       return"index";

    }

   

}

         访问reg4方法,既可以看到效果。

 

  

获得request对象、session对象

普通的Controller类,示例代码如下:

@Controller

@RequestMapping("/user.do")

publicclass UserController {

   

    @RequestMapping(params="method=reg2")

    public String reg2(String uname,HttpServletRequest req,ModelMap map){

       req.setAttribute("a","aa");

       req.getSession().setAttribute("b","bb");

       return"index";

    }

}

 

ModelMap

         map的实现,可以在其中存放属性,作用域同request。下面这个示例,我们可以在modelMap中放入数据,然后在forward的页面上显示这些数据。通过el表达式、JSTLjava代码均可。代码如下:

        

package com.sxt.web;

 

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

 

@Controller

@RequestMapping("/user.do")

publicclass UserControllerextends MultiActionController {

   

    @RequestMapping(params="method=reg")

    public String reg(String uname,ModelMap map){

       map.put("a","aaa");

       return"index";

    }

}

<%@ page language="java"import="java.util.*"pageEncoding="gbk"%>

<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>

DOCTYPEHTMLPUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>head>

  <body>

       <h1>${requestScope.a}h1>

       <c:out value="${requestScope.a}">c:out>

  body>

html>


将属性u的值赋给形参uname

ModelAndView模型视图类

见名知意,从名字上我们可以知道ModelAndView中的Model代表模型,View代表视图。即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性。我们看一下ModelAndView的部分源码,即可知其中关系:

 

 

public class ModelAndView {

 /** View instance or view name String */
 private Object view;

 /** Model Map */
 private ModelMap model;

 /**
  * Indicates whether or not this instance has been cleared with a call to {@link #clear()}.
  */
 private boolean cleared = false;


 /**
  * Default constructor for bean-style usage: populating bean
  * properties instead of passing in constructor arguments.
  * @see #setView(View)
  * @see #setViewName(String)
  */
 public ModelAndView() {
 }

 /**
  * Convenient constructor when there is no model data to expose.
  * Can also be used in conjunction with addObject.
  * @param viewName name of the View to render, to be resolved
  * by the DispatcherServlet's ViewResolver
  * @see #addObject
  */
 public ModelAndView(String viewName) {
  this.view = viewName;
 }

 /**
  * Convenient constructor when there is no model data to expose.
  * Can also be used in conjunction with addObject.
  * @param view View object to render
  * @see #addObject
  */
 public ModelAndView(View view) {
  this.view = view;
 }

 /**
  * Creates new ModelAndView given a view name and a model.
  * @param viewName name of the View to render, to be resolved
  * by the DispatcherServlet's ViewResolver
  * @param model Map of model names (Strings) to model objects
  * (Objects). Model entries may not be null, but the
  * model Map may be null if there is no model data.
  */
 public ModelAndView(String viewName, Map model) {
  this.view = viewName;
  if (model != null) {
   getModelMap().addAllAttributes(model);
  }
 }

 /**
  * Creates new ModelAndView given a View object and a model.
  * Note: the supplied model data is copied into the internal
  * storage of this class. You should not consider to modify the supplied
  * Map after supplying it to this class

  * @param view View object to render
  * @param model Map of model names (Strings) to model objects
  * (Objects). Model entries may not be null, but the
  * model Map may be null if there is no model data.
  */
 public ModelAndView(View view, Map model) {
  this.view = view;
  if (model != null) {
   getModelMap().addAllAttributes(model);
  }
 }

 /**
  * Convenient constructor to take a single model object.
  * @param viewName name of the View to render, to be resolved
  * by the DispatcherServlet's ViewResolver
  * @param modelName name of the single entry in the model
  * @param modelObject the single model object
  */
 public ModelAndView(String viewName, String modelName, Object modelObject) {
  this.view = viewName;
  addObject(modelName, modelObject);
 }

 /**
  * Convenient constructor to take a single model object.
  * @param view View object to render
  * @param modelName name of the single entry in the model
  * @param modelObject the single model object
  */
 public ModelAndView(View view, String modelName, Object modelObject) {
  this.view = view;
  addObject(modelName, modelObject);
 }


 /**
  * Set a view name for this ModelAndView, to be resolved by the
  * DispatcherServlet via a ViewResolver. Will override any
  * pre-existing view name or View.
  */
 public void setViewName(String viewName) {
  this.view = viewName;
 }

 /**
  * Return the view name to be resolved by the DispatcherServlet
  * via a ViewResolver, or null if we are using a View object.
  */
 public String getViewName() {
  return (this.view instanceof String ? (String) this.view : null);
 }

 /**
  * Set a View object for this ModelAndView. Will override any
  * pre-existing view name or View.
  */
 public void setView(View view) {
  this.view = view;
 }

 /**
  * Return the View object, or null if we are using a view name
  * to be resolved by the DispatcherServlet via a ViewResolver.
  */
 public View getView() {
  return (this.view instanceof View ? (View) this.view : null);
 }

 /**
  * Indicate whether or not this ModelAndView has a view, either
  * as a view name or as a direct {@link View} instance.
  */
 public boolean hasView() {
  return (this.view != null);
 }

 /**
  * Return whether we use a view reference, i.e. true
  * if the view has been specified via a name to be resolved by the
  * DispatcherServlet via a ViewResolver.
  */
 public boolean isReference() {
  return (this.view instanceof String);
 }

 /**
  * Return the model map. May return null.
  * Called by DispatcherServlet for evaluation of the model.
  */
 protected Map getModelInternal() {
  return this.model;
 }

 /**
  * Return the underlying ModelMap instance (never null).
  */
 public ModelMap getModelMap() {
  if (this.model == null) {
   this.model = new ModelMap();
  }
  return this.model;
 }

 /**
  * Return the model map. Never returns null.
  * To be called by application code for modifying the model.
  */
 public Map getModel() {
  return getModelMap();
 }


 /**
  * Add an attribute to the model.
  * @param attributeName name of the object to add to the model
  * @param attributeValue object to add to the model (never null)
  * @see ModelMap#addAttribute(String, Object)
  * @see #getModelMap()
  */
 public ModelAndView addObject(String attributeName, Object attributeValue) {
  getModelMap().addAttribute(attributeName, attributeValue);
  return this;
 }

 /**
  * Add an attribute to the model using parameter name generation.
  * @param attributeValue the object to add to the model (never null)
  * @see ModelMap#addAttribute(Object)
  * @see #getModelMap()
  */
 public ModelAndView addObject(Object attributeValue) {
  getModelMap().addAttribute(attributeValue);
  return this;
 }

 /**
  * Add all attributes contained in the provided Map to the model.
  * @param modelMap a Map of attributeName -> attributeValue pairs
  * @see ModelMap#addAllAttributes(Map)
  * @see #getModelMap()
  */
 public ModelAndView addAllObjects(Map modelMap) {
  getModelMap().addAllAttributes(modelMap);
  return this;
 }


 /**
  * Clear the state of this ModelAndView object.
  * The object will be empty afterwards.
  *

Can be used to suppress rendering of a given ModelAndView object
  * in the postHandle method of a HandlerInterceptor.
  * @see #isEmpty()
  * @see HandlerInterceptor#postHandle
  */
 public void clear() {
  this.view = null;
  this.model = null;
  this.cleared = true;
 }

 /**
  * Return whether this ModelAndView object is empty,
  * i.e. whether it does not hold any view and does not contain a model.
  */
 public boolean isEmpty() {
  return (this.view == null && CollectionUtils.isEmpty(this.model));
 }

 /**
  * Return whether this ModelAndView object is empty as a result of a call to {@link #clear}
  * i.e. whether it does not hold any view and does not contain a model.
  *

Returns false if any additional state was added to the instance
  * after the call to {@link #clear}.
  * @see #clear()
  */
 public boolean wasCleared() {
  return (this.cleared && isEmpty());
 }


 /**
  * Return diagnostic information about this model and view.
  */
 @Override
 public String toString() {
  StringBuilder sb = new StringBuilder("ModelAndView: ");
  if (isReference()) {
   sb.append("reference to view with name '").append(this.view).append("'");
  }
  else {
   sb.append("materialized View is [").append(this.view).append(']');
  }
  sb.append("; model is ").append(this.model);
  return sb.toString();
 }
}

 -----------------------测试代码如下---------------------

测试代码如下:
package com.sxt.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.sxt.po.User;

@Controller
@RequestMapping("/user.do")
public class UserController extends MultiActionController  {
 
 @RequestMapping(params="method=reg")
 public ModelAndView reg(String uname){
  ModelAndView mv = new ModelAndView();
  mv.setViewName("index");
//  mv.setView(new RedirectView("index"));
  
  User u = new User();
  u.setUname("高淇");
  mv.addObject(u);   //查看源代码,得知,直接放入对象。属性名为”首字母小写的类名”。 一般建议手动增加属性名称。
  mv.addObject("a", "aaaa");
  return mv;
 }

}
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


 
 
 
   

${requestScope.a}


   

${requestScope.user.uname}


 

地址栏输入:http://localhost:8080/springmvc03/user.do?method=reg
结果为:
 

 

 转载:http://blog.csdn.net/jzhf2012/article/details/8463783

你可能感兴趣的:(Spring MVC 3.0 深入及对注解的详细讲解 .)