SpringMVC(最新教程)

初识springMVC

Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
常见MVC框架比较
运行性能上:
Jsp+servlet>struts1>spring mvc>struts2+freemarker>>struts2,ognl,值栈。
开发效率上,基本正好相反。值得强调的是,spring mvc开发效率和struts2不相上下。
Struts2的性能低的原因是因为OGNL和值栈造成的。所以,如果你的系统并发量高,可以使用freemaker进行显示,而不是采用OGNL和值栈。这样,在性能上会有相当大得提高。

基于spring3.2的 采用annotation方式搭建springMVC环境
1、上官网下载对应的zip包当然该zip并非最新的。下载地址为:http://repo.spring.io/webapp/home.html?0
2、解压之后得到目录:

打开libs会看到会多jar

这里边包括了所有的jar和source和doc。当然我们只是需要使用jar就可以了。

3、创建空的web项目 目录结构如下:

其中user实体类为:

public class User {
	private String name;
	private Integer age;
	private Date birth;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public User(String name, Integer age, Date birth) {
		super();
		this.name = name;
		this.age = age;
		this.birth = birth;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String name) {
		super();
		this.name = name;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "["+name+"]";
	}
}

4、在项目中添加如下jar文件:
spring-webmvc-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-beans-3.2.0.RELEASE.jar
spring-web-3.2.0.RELEASE.jar
commons-logging.jar
spring-expression-3.2.0.RELEASE.jar
其中commons-logging.jar请单独下载。
5、在web.xml中添加过滤器的配置。

<servlet>
		<servlet-name>example</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<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>example</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

这个org.springframework.web.servlet.DispatcherServle即为springMVC的核心控制器。
其中init-param中配置的是spring的配置文件的文件路径。
6、在WEB-INF下添加spring的配置文件spring-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:mvc="http://www.springframework.org/schema/mvc"    
    xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:util="http://www.springframework.org/schema/util"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd    
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd    
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 
<!-- 启动spring自动扫描 -->
<context:component-scan base-package="com.niit.springmvc"/>
<mvc:annotation-driven />  <!-- 支持spring3.0新的mvc注解 -->
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
其中schemaLocation和xmlns建议直接拷贝。 7、创建UserController如下:
@Controller
@RequestMapping("/user.do")
public class UserController {
	
	@RequestMapping(params="method=add")
	public String addUser(Model model){
		model.addAttribute("message", "添加了一个用户");
		System.out.println("UserController.addUser()");
		return "/WEB-INF/jsp/addsuc.jsp";
	}
}

其中@RequestMapping("/user.do")的配置是指:该controller的请求url为:user.do
@RequestMapping(params=“method=add”)的注解是指:凡是请求的url为:user.do而带了参数method=add的请求会由方法addUser来处理。
addUser的形参model为后续讲解内容。
return “/WEB-INF/jsp/addsuc.jsp”; 是告诉spring完成处理之后直接进入该视图。
8、添加对应的页面,测试请求user.do?method=add

springMVC的RequestMapping的基本设置
1、在类的上面注解@RequestMapping("/ex.do")意思为所有的ex.do请求全部进入该类处理。如上一章代码中编写@RequestMapping("/user.do").所有的user.do请求都会进入该Controller。
2、在自定义的controller中会调用有@RequestMapping注解字样的方法来处理请求。
@Controller
@RequestMapping("/user.do")
public class UserController {

@RequestMapping
public String addUser(Model model){
	model.addAttribute("message", "添加了一个用户");
	System.out.println("UserController.addUser()");
	return "/WEB-INF/jsp/addsuc.jsp";
}

}
3、当然可以编写多个处理请求的方法,而这些方法的调用都是通过@RequestMapping的属性类控制调用的。
@RequestMapping属性:
value:指定请求的实际地址,指定的地址可以是URI Template 模式 (最终请求的url为类的注解的url+方法注解的url)
value的uri值为以下三类:
A) 可以指定为普通的具体值;
如:
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value="/some.do")
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
System.out.println(“handleRequest”);
return new ModelAndView("/WEB-INF/jsp/addsuc.jsp");
}
}
该注解的是说:请求的url为”user/some.do”就会进入该方法(handleRequest)处理。
url:user/some.do
B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
如:@RequestMapping(value="/{userId}/delete.do",method=RequestMethod.GET)
public String delete(@PathVariable String userId){
System.out.println(“delete:”+userId);
return “/WEB-INF/jsp/addsuc.jsp”;
}
这个注解:url中带了参数的数据 userId url:user/1123/delete.do
使用@PathVariable 指定形参接收url中的数据
C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);
如:
@RequestMapping(value="/{userBirth:\d{4}-\d{2}-\d{2}}/update.do")
public String update(@PathVariable String userBirth){
System.out.println(“userBirth:”+userBirth);
return “/WEB-INF/jsp/addsuc.jsp”;
}
请求的url类似:user/1990-11-11/update.do
使用@PathVariable 指定形参接收url中的数据
method: 指定请求的method类型, GET、POST、PUT、DELETE等; (也就是说只有制定类型的请求才会进入该方法处理)
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
4、当类没有@RequestMapping注解时,则直接参考方法的注解匹配对于的url。如:
@Controller
public class UserController{
@Controller
@RequestMapping("/user.do")
public void managerUser(){}
}
在这里url为user.do则直接使用managerUser处理请求。

在controller中获取前台传递的参数

将页面数据传递到controller
页面表单:

<form action="user.do" method="post">
    	用户名:<input type="text" name="name"/><br/>
    	年龄:<input type="text" name="age"/><br/>
    	生日:<input type="text" name="birth"/><br/>
    	<input type="submit" value="添加"/>
</form>

Controller为:
/**
* 1、直接使用形参获取前台传递的参数数据
* 要注意的是形参的名字必须和页面参数的名字一致
* @param model
* @param name
* @param age
* @param birth
* @return
*/

@RequestMapping(method=RequestMethod.POST)
	public String addUser(Model model,String name,Integer age,Date birth){
		model.addAttribute("message", "添加了一个用户");
		System.out.println("name:"+name + "\tage:"+age+"\tbirht:"+birth);
		System.out.println("UserController.addUser()");
		return "/WEB-INF/jsp/addsuc.jsp";
	}

/**
* 2、使用对象接受前台传递的参数,
* 要注意的是前台传递的参数的名称必须和对象的属性名称一直,如果不一致则可以使用@ModelAttribute(“u”)String uname指定
*/

@RequestMapping(method=RequestMethod.POST)
	public String addUser(Model model,User user){
		model.addAttribute("message", "添加了一个用户");
		System.out.println("name:"+user.getName() + "\tage:"+user.getAge()+"\tbirht:"+user.getBirth());
		System.out.println("UserController.addUser()");
		return "/WEB-INF/jsp/addsuc.jsp";
	}

在controller中获取web元素
当某个方法需要使用web对象时(request,response,session,application)
可以使用如下方式:
除过application其他的对象都可以直接设为方法的形参即可。spring会自动将对应的对象传递给对应的形参。
而application对象可以使用session对象获取。

当然也可以在方法中使用response对象重定向到其他的url 这时方法最后return的url则可以视作无效。
同样的也可以使用request对象转发到其他的url。
程序示例:

@RequestMapping(value="/web.do")
	public String getWebElement(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws IOException, ServletException{
		System.out.println("使用request获取的前台参数:"+request.getParameter("pname"));
		request.setAttribute("message", "这个是request中的数据");
		session.setAttribute("message", "这个是session中的数据");
		session.getServletContext().setAttribute("message", "这个是application中的数据");
		//response.sendRedirect("http://www.baidu.com");
		//return null;
		
		//request.getRequestDispatcher("/WEB-INF/jsp/showData.jsp").forward(request, response);
		
		return "/WEB-INF/jsp/showData.jsp";
	}

将controller中数据传递到jsp页面
1、可以在controller中获取request对象,然后将数据设置为request对象的属性,然后使用转发的方式进入jsp即可。这一点不赘述。
2、将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如:
new ModelAndView("/WEB-INF/jsp/showData.jsp",“message”,message)
其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象。
在这里要注意的是 数据是默认被存放在request中的。
程序示例:
//使用modelAndView对象将数据传递到前台。
@RequestMapping(value="/mad/showData_1.do")
public ModelAndView showData_1(){
String message = “这个是要传递的数据”;
//其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象。
//在这里要注意的是 数据是默认被存放在request中的。
return new ModelAndView("/WEB-INF/jsp/showData.jsp",“message”,message);
}
前台页面获取方式:
request: r e q u e s t S c o p e . m e s s a g e < b r / > 2.1 、 可 以 在 类 的 前 面 添 加 注 解 @ S e s s i o n A t t r i b u t e s ( " m e s s a g e " , " u s e r " ) 这 个 注 解 可 以 设 置 对 应 的 m o d e l 中 参 数 也 会 在 s e s s i o n 中 存 储 一 份 。 该 注 解 中 的 参 数 为 一 个 集 合 , 可 以 写 多 个 , 如 上 面 的 例 子 , 其 中 m e s s a g e 和 u s e r 都 是 存 储 的 数 据 的 k e y . 示 例 程 序 : @ S e s s i o n A t t r i b u t e s ( " m e s s a g e " , " u s e r " ) / / m o d e l A n d V i e w 中 的 对 应 的 数 据 也 会 在 s e s s i o n 中 存 储 一 份 页 面 获 取 : s e s s i o n : {requestScope.message }<br/> 2.1 、可以在类的前面添加注解@SessionAttributes({"message","user"}) 这个注解可以设置对应的model中参数也会在session中存储一份。该注解中的参数为一个集合,可以写多个,如上面的例子,其中message和user都是存储的数据的key. 示例程序: @SessionAttributes({"message","user"}) //modelAndView中的对应的数据也会在session中存储一份 页面获取: session: requestScope.message<br/>2.1@SessionAttributes("message","user")modelsessionmessageuserkey.@SessionAttributes("message","user")//modelAndViewsessionsession:{sessionScope.message }

3、数据modelAndView返回一个集合
该处理方式和上面的处理方式一直,因为modelAndView接受的数据类型是Object的,集合也是一样的处理方式
//使用modelAndView对象将数据传递到前台。
//传递多个参数(不同类型的)
@RequestMapping(value="/mad/showData_2.do")
public ModelAndView showData_2(){
System.out.println(“showData_2”);
String message = “这个是要传递的数据”;
User user = new User(“张三”, 12, new Date());
List us= new ArrayList();
us.add(new User(“张三”, 12, new Date()));
us.add(new User(“张四”, 13, new Date()));
us.add(new User(“张五”, 14, new Date()));
ModelAndView mad = new ModelAndView("/WEB-INF/jsp/showData.jsp");
//将数据存入modelMap
mad.addObject(“message”, message);
mad.addObject(user);//默认为类名的首字母小写
mad.addObject(“users”, us);
return mad;
}
前台页面获取方式:
request: r e q u e s t S c o p e . m e s s a g e < b r / > < c : f o r E a c h i t e m s = " {requestScope.message }<br/> <c:forEach items=" requestScope.message<br/><c:forEachitems="{requestScope.users }" var=“u”>
u . n a m e − {u.name }- u.name{u.age }-${u.birth }

</c:forEach>

4、使用modelAndView传递多个参数。
可以通过ModelAndView的mad.addObject(“message”, message);方法设置参数。
该方法中第一个参数为数据的key,第二个参数为数据对象。
也可以使用mad.addObject(user);方法
该方法中数据的参数为数据对象,数据的key为该对象的类的类名(其中首字母小写)。
5、使用ModelMap传递多个数据到jsp中。
在方法的参数列表中添加形参 ModelMap map,spring 会自动创建ModelMap对象。
然后调用map的put(key,value)或者addAttribute(key,value)将数据放入map中,spring会自动将数据存入request。
示例程序:
//使用modelMap对象将数据传递到前台。
//传递多个参数(不同类型的)
@RequestMapping(value="/mad/showData_3.do")
public String showData_3(ModelMap map){
System.out.println(“showData_3”);
String message = “这个是要传递的数据”;
User user = new User(“张三”, 12, new Date());
List us= new ArrayList();
us.add(new User(“张三”, 12, new Date()));
us.add(new User(“张四”, 13, new Date()));
us.add(new User(“张五”, 14, new Date()));
//将数据存入modelMap
map.put(“message”, message);
map.addAttribute(“user”, user);
map.put(“users”, us);
return “/WEB-INF/jsp/showData.jsp”;
}
页面调用:

request:${requestScope.message }<br/>
    session:${sessionScope.message }<br/>
   	application:${applicationScope.message }<br/>
   	<hr/>
   	<h1>ModelMap中的数据</h1>
   	${requestScope.message }<br/>
   	${requestScope.user.name }<br/>
	<p>列表</p>
	<c:forEach items="${requestScope.users }" var="u">
		${u.name }-${u.age }-${u.birth }<br/>
</c:forEach>

设置跳转方式为重定向或者转发
1、spring默认的跳转方式即为转发,当然转发也可以写作:return “forward:/WEB-INF/jsp/showData.jsp”;
2、重定向必须写作:return “redirect:http://www.baidu.com”;

视图解析器的配置和使用
1、在spring-servlet.xml中配置视图解析器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="suffix" value=".jsp"/> <!-- 视图后缀,controller中的方法返回的url字符串会添加该后缀 -->
	<property name="prefix" value="/WEB-INF/jsp/"/> <!-- 视图后缀controller中的方法返回的url字符串会添加该前缀 -->
</bean>

配置该解析器之后,那么controller中的返回的视图url就可以改写了。
改写如下:
return “showData”; 实际跳转的url为:/WEB-INF/jsp/showData.jsp

controller中方法的返回值类型
springMvc中controller中方法的返回值除了可以返回String和ModelAndView两种类型外还有其他类型。
在这里上面用过的两种类型不再赘述。
其他类型还包括:void、ModelMap、Map、Object、map、List、Set。一般建议使用String。
1、void 返回值类型为void 则只是纯粹的执行了方法中的程序,然后响应的url依然为请求的url
例如案例中请求为index.do 则响应的url为 index 在视图解析器解析之后得到的最终的url为 /WEB-INF/jsp/index.jsp
示例:
//返回值为vood
@RequestMapping(value="/index.do",params=“type=void”)
public void resultVoid(HttpServletRequest request){
request.setAttribute(“void”, “resultVoid”);
}
2、ModelMap 返回值为modelMap时,响应的url和void一致。
只是存储在MpdelMap中的数据可以在jsp页面中取出。
示例:
//返回值为ModelMap
@RequestMapping(value=“index.do”,params=“type=modelMap”)
public ModelMap resultModelMap(ModelMap map){
map.put(“msg”, “这里是modleMap中的数据”);
return map;
}
3、Map 和modelMap几乎完全一直。
示例:
//返回值为Map
@RequestMapping(value=“index.do”,params=“type=map”)
public Map resultMap(){
Map<String,String> map = new HashMap<String,String>();
map.put(“msg”, “这里是Map中的数据”);
return map;
}
4、List 返回list是响应的url和void一致。
只是spring会将list对象存储在request中,而该对象的存储的key为:当list中存储为String类型数据时 key为:stringList,当存储为User对象时 key为:userList。其他的类型的可以类比。
//返回值为List
@RequestMapping(value=“index.do”,params=“type=list_string”)
public List resultList_String(){
List ls = new ArrayList();
ls.add(“list1”);ls.add(“list2”);ls.add(“list3”);
return ls;
}
//返回值为List
@RequestMapping(value=“index.do”,params=“type=list_user”)
public List resultList_User(){
List ls = new ArrayList();
ls.add(new User(“张三”));
ls.add(new User(“张四”));
return ls;
}
5、Set 返回Set类型的数据时和List除了没有顺序之外,其他都一直。
//返回值为Set
@RequestMapping(value=“index.do”,params=“type=set_user”)
public Set resultSet_User(){
Set ls = new HashSet();
ls.add(new User(“张三”));
ls.add(new User(“张四”));
return ls;
}
6、Object 返回object时,响应的url和以上一直,spirng也会将返回的对象存储在request中,该对象在request中的key为该对象类型的类名(首字母小写)
//返回值为User
@RequestMapping(value=“index.do”,params=“type=user”)
public User resultUser(){
return new User(“张四”);
}
所有的返回值类型页面获取方式为:

返回值类型

Void

无返回值类型
${requestScope.void }

ModelMap

返回ModelMap
${requestScope.msg }

Map

返回map
${requestScope.msg }

List

返回List<String>
${requestScope.stringList }

List

返回List<User>
${requestScope.userList }

Set

返回Set<User>
${requestScope.userSet }
 <h3>User(Object)</h3>
<a href="index.do?type=user">返回User(Object)</a><br/>
${requestScope.user }

springMVC的文件上传于下载
1、springmvc 文件的上传也是借助于两个工具所以需要添加两个jar
apache-commons-fileupload.jar
apache-commons-io.jar
2、在spring-servlet.xml中添加文件上传的处理bean的配置。







其中属性
的配置配置的是临时文件目录,spring会将文件先传到临时文件,然后我们再调用对应的API将临时文件写到目标文件。
3、编写上传文件的controller
3.1上传一个文件
直接在处理的方法中设置形参@RequestParam(“file”) CommonsMultipartFile file
注意这里的参数必须使用@RequestParam指定。
然后调用方法file.getFileItem().write(targetFile);将临时文件写出到目标文件。
示例:
/**
* 上传一个文件
* @param name
* @param file
* @param session
* @return
*/
@RequestMapping(value="/upload.do",method=RequestMethod.POST)
public String fileUpLoad(String name,@RequestParam(“file”) CommonsMultipartFile file,HttpSession session){
if(!file.isEmpty()){
String path = session.getServletContext().getRealPath("/upload/");
String fileName = file.getOriginalFilename();
String fileType = fileName.substring(fileName.lastIndexOf("."));
File targetFile = new File(path,new Date().getTime()+fileType);
try {
file.getFileItem().write(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
}
return “showData”;
}
3.2上传多个文件
上传多个文件时,其实和上传一个文件一样,只是将形参改为@RequestParam(“file”) CommonsMultipartFile[] file
然后我们只需在方法中循环处理这些文件即可。
示例:

/**
	 * 上传多个文件
	 * @param name
	 * @param files
	 * @param session
	 * @return
	 */
	@RequestMapping(value="/mupload.do",method=RequestMethod.POST)
	public String muFileUpLoad(String name,@RequestParam("file") CommonsMultipartFile[]  files,HttpSession session){
		if(files!=null && files.length>0){
			String path = session.getServletContext().getRealPath("/upload/");
			for (CommonsMultipartFile file : files) {
				String fileName = file.getOriginalFilename();
				String fileType = fileName.substring(fileName.lastIndexOf("."));
				File targetFile = new File(path,new Date().getTime()+fileType);
				try {
					file.getFileItem().write(targetFile);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			
		}
		return "showData";
	}

4、文件下载
文件下载其实和spring没关系,还是使用最普通的方式实现下载即可,在这里不赘述。
示例:

/**
	 * 文件下载
	 * @param session
	 * @param response
	 * @param fileName
	 * @param isOnline
	 * @throws Exception
	 */
	@RequestMapping(value="/downLoad.do",method=RequestMethod.GET)
	public void downLoad(HttpSession session,HttpServletResponse response,String fileName,boolean isOnline)throws Exception{
		String path = session.getServletContext().getRealPath("/upload/")+"\\"+fileName;
		File file = new File(path);
		System.out.println(path);
		if(!file.exists()){
			response.sendError(404, "您要下载的文件没找到");
			return;
		}
		BufferedInputStream bufIn = new BufferedInputStream(new FileInputStream(file));
		byte [] buff = new byte[1024];
		int len = -1;
		response.reset();
		if(isOnline){
			URL u = new URL("file:///"+path);
			response.setContentType(u.openConnection().getContentType());
			response.setHeader("Content-Disposition", "inline;filename="+fileName);
			
		}else{
			response.setContentType("application/x-msdownload");
			response.setHeader("Content-Disposition", "attachment;filename="+fileName);
		}
		OutputStream out = response.getOutputStream();
		while((len=bufIn.read(buff))!=-1){
			out.write(buff,0,len);
			out.flush();
		}
		bufIn.close();
		out.close();
	}

springMVC和jQuery的Ajax结合
1、使用@RequestBody 接收前台传递的json 集合数据。
首先:从spring3.1开始只要配置了<mvc:annotation-driven /> 就不用再配置其他转换器了。
然后添加json的几个jar:jackson-annotations-2.4.0.jar,jackson-core-2.4.1.jar,jackson-databind-2.4.1.jar
这些jar建议从官网上下载最新的(http://wiki.fasterxml.com/JacksonDownload)
在这里要注意的是,如果jackson的jar如果和spring的版本不匹配,可能会出现响应状态码415.如果出现415响应状态吗,不能解决可以联系此文档的主人 qq:2780004063 或者发送邮件。
@RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。
1.1
在前台js中创建JSON字符串。如[{name:‘11’,age:12},{name:‘222’,age:15}],
然后使用JSON.stringify将该json对象转换为json字符串,因为@RequstBody只接受json字符串。
示例:

$("#saveUser").click(function() {
			var users = [{
				name : '张三',
				age : 18,
				birth : '2014-11-11'
			}, {
				name : '王五',
				age : 18,
				birth : '2014-11-11'
			}, {
				name : '李四',
				age : 18,
				birth : '2014-11-11'
			} ];
			$.ajax({
				type : 'POST',
				data:JSON.stringify(users),
				contentType : 'application/json',
				dataType: 'json',
				url : 'user/saveJsonUser.do',
				success : function(data) {
					alert("OK");
				},
				error : function(e) {
					alert("error");
				}
			});
		});
1.2
使用Ajax提交数据需要注意的是:contentType : 'application/json',dataType: 'json',
这两个属性必须这样设置。
1.3
Controller中的处理方法的形参需要添加注解@RequestBody  而且形参必须是数组或者list。
如:@RequestBody User[] users

示例:
/**
* 使用@RequestBody接受前台传递的一组json数据
* @param users
* @return
/
@RequestMapping(value="/saveJsonUser.do",method=RequestMethod.POST)
public String saveJsonUser(@RequestBody User[] users){
for (User user2 : users) {
System.out.println(user2);
}
System.out.println(users);
return “saveUser”;
}
2、使用@Response返回指定形式的返回值。
在返回值类型钱添加@Response注解之后,spring不会再对返回的url进行解析,而是直接将返回的对象转化成对应的字符串形式放入respons的流中输出到客户端。
2.1如果返回的为字符串,则直接将该字符串输出到客户端。
示例:
/
*
* 使用@ResponseBody返回普通字符串。
* @param name
* @return
*/
@RequestMapping(value="/checkName.do")
public @ResponseBody String checkName(String name){
name = “userName is:”+name;
return name;
}
2.2如果是其他形式的对象,则spring会自动将这些对象转换为对应的json形式的字符串,然后将字符串输出到客户端。
示例:

/**
	 * 使用@ResponseBody返回一个对象集合。
	 * @param name
	 * @return
	 */
	@RequestMapping(value="/getUsers.do")
	public @ResponseBody List<User> getUsers(){
		List<User> us = new ArrayList<User>();
		us.add(new User("张三", 12, new Date()));
		us.add(new User("张四", 13, new Date()));
		us.add(new User("张五", 14, new Date()));
		return us;
	}
	
/**
 * 使用@ResponseBody返回一个对象。
 * @param name
 * @return
 */
@RequestMapping(value="/getUser.do")
public @ResponseBody User getUser(){
	return new User("老黑",45,new Date());
}

还有springMVC和hibern的整合尚未整理,待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值