三大框架之SpringMVC4框架 第三章

第3章 SpringMVC注解式开发

所谓SpringMVC的注解式开发是指,处理器是基于注解的类的开发。对于每一个定义的处理器,无需在配置文件中逐个注册,只需在代码中通过对类与方法的注解,便可完成注册。
即注解替换的是配置文件中对于处理器的注册部分。
注解式开发是重点。

3.1 第一个注解式开发程序

1、在springmvc.xml 注册组件扫描器
文件约束省略了,只有这一行代码
/21-primary-annotation

<!-- 注册组件扫描器 -->
	<context:component-scan base-package="com.bjpowernode.handlers"/>

2、定义处理器
此时的处理器类无需继承任何父类,实现任何接口。只需在类上与方法上添加相应注解即可。
@Controller:表示当前类为处理器
@RequestMapping:表示当前方法为处理器方法。该方法要对 value属性所指定的URL进行处理与响应。被注解的方法的方法名可以随意。

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping(value={"/my.do", "hello.do"}, method=RequestMethod.POST)
	public ModelAndView doFirst(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFirst()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}

	@RequestMapping("/second.do")
	public ModelAndView doSecond(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doSecond()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/third*.do")	//资源名称必须以third开头 ,最后一个斜杠后面的东西
	public ModelAndView doThird(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doThird()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/*fourth.do")	//资源名称必须以fourth结尾
	public ModelAndView doFourth(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFourth()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/*/fifth.do")	//路径级数的绝对匹配,即要求在test与fifth.do之间必须要有一级路径
	public ModelAndView doFifth(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFifth()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/**/sixth.do")	//要求在test与fifth.do之间可以包含多级路径,也可以没有其它路径
	public ModelAndView doSixth(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doSixth()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}

}

3、初始页面 index.jsp

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	
	<body>
		This is my JSP page. <br>
	</body>
</html>

4、跳转到的欢迎页面 welcome.jsp

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	
	<body>
		This is my JSP page. <br>
	</body>
</html>

web.xml
5、web.xml
注册中央调度器
指定SpringMVC配置文件的位置及文件名
指定创建servlet的url为*.do

 <!-- 注册中央调度器 -->
  <servlet>
  	<servlet-name>springMVC</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 指定SpringMVC配置文件的位置及文件名 -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc.xml</param-value>
  	</init-param>
  	<!-- 原来是执行.do,才创建,效率低。现在表示Tomcat在启动时,直接创建当前Servlet(把DispatcherServlet这个对象给创建了),大于0就行 -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>springMVC</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

3.2处理器的请求映射规则的定义

通过@RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。

3.2.1对请求URI的命名空间的定义

@RequestMapping的value属性用于定义所匹配请求的URI。但对于注解在方法上与类上,其value属性所指定的URI,意义是不同的。
一个@Controller所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法所匹配的URI是不同的。这些不同的URI被指定在注解于方法之上的@RequestMapping的value属性中。但若这些请求具有相同的URI部分,则这些相同的URI,可以被抽取到注解在类之上的@RequestMapping的 value属性中。此时的这个URI称为命名空间。
换个角度说,要访问处理器的指定方法,必须要在方法指定URI之前加上处理器类前定义的命名空间。
如上述代码中:
要执行doFirst()方法必须输入 服务器应用地址 + /test/my.do

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping(value={"/my.do", "hello.do"}, method=RequestMethod.POST)
	public ModelAndView doFirst(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFirst()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}

3.2.2请求URI中通配符的应用

(1)资源名称中使用通配符
在请求的资源名称中使用通配符,表示请求的资源名称中只要包含指定的字符即可完成匹配。
例如,下面的写法中/some*.do表示的意思是,只要请求的资源名称以some开头即可;
/other.do 表示的意思是,只要请求的资源名称以other结尾即可。
2)资源路径中使用通配符
在资源路径中使用通配符,有两种用法:路径级数的精确匹配,与路径级数的可变匹配。
/xxx/
/show.do:表示在show.do的资源名称前面,只能有两级路径,第一级必须是/xxx,而第二级随意。这种称为路径级数的精确匹配。
/xxx/**/show.do:表示在show.do的资源名称前面,必须以/xxx路径开头,而其它级的路径是否包含、若包含又包含几级,各级又叫什么名称,均随意。这种称为路径级数的可变匹配。

上述代码中 执行doThird()方法 执行doFourth()方法符合第一个
五和六方法符合第二个

@RequestMapping("/third*.do")	//资源名称必须以third开头 ,最后一个斜杠后面的东西
	public ModelAndView doThird(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doThird()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/*fourth.do")	//资源名称必须以fourth结尾
	public ModelAndView doFourth(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFourth()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/*/fifth.do")	//路径级数的绝对匹配,即要求在test与fifth.do之间必须要有一级路径
	public ModelAndView doFifth(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFifth()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
	@RequestMapping("/**/sixth.do")	//要求在test与fifth.do之间可以包含多级路径,也可以没有其它路径
	public ModelAndView doSixth(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doSixth()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}

3.2.3对请求提交方式的定义

对于@RequestMapping,其有个属性method,用于对被注解方法所处理请求的提交方式进行限制,即只有满足该method属性指定的提交方式的请求,才会执行该被注解方法。
Method 属性的取值为RequestMethod 枚举常量。常用的为RequestMethod.GET与RequestMethod.POST,分别表示提交方式的匹配规则为GET与POST提交。

@RequestMapping(value={"/my.do", "hello.do"}, method=RequestMethod.POST)
	public ModelAndView doFirst(HttpServletRequest request, 
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("message", "执行doFirst()方法");
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}

以上处理器方法只能处理POST方式提交的请求。客户端浏览器常用的请求方式,及其提交方式有以下几种:
在这里插入图片描述
也就是说,只要指定了处理器方法匹配的请求提交方式为POST,则相当于指定了请求发送的方式:要么使用表单请求,要么使用AJAX请求。其它请求方式被禁用。
当然,若不指定method属性,则无论是GET还是POST提交方式,均可匹配。即对于请求的提交方式无要求。

3.3 处理器方法的参数

处理器方法可以包含以下五类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。

>HttpServletRequest
>HttpServletResponse
>HttpSession
>用于承载数据的Model
>>请求中所携带的请求参数

对于前四种参数,在以后的学习过程中会逐个用到。这里只举例第五类参数:
请求中所携带的请求参数。即处理器方法是如何接收请求参数的。

3.3.1 逐个参数接收

只要保证请求参数名与该请求处理方法的参数名相同即可。
/22-receiveParameters-property
1、修改index页面
这里初始页面换成一个表单

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	
	<body>
		<form action="${pageContext.request.contextPath }/test/register.do" method="POST">
			姓名:<input type="text" name="name"/><br>
			年龄:<input type="text" name="age"/><br>
			<input type="submit" value="注册"/>
		</form>
	</body>
</html>

2、修改处理器类MyController
将输入的学生信息syso输出,并放入到跳转到的welcome页面。(其实就是放在request域空间)

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/register.do")
	public ModelAndView doRegister(String name, int age) {
		System.out.println("name = " + name);
		System.out.println("age = " + age);
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("name", name);//其实就是放在request域空间
		mv.addObject("age", age);
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
}

3、在WEB-INF/jsp下添加 welcom.jsp页面

<html>
	<head>
		<title>welcome page</title>
	</head>
	
	<body>
		name = ${name }<br>
		age = ${age }<br>
	</body>
</html>

3.3.2 请求参数中文乱码问题

对于前面所接收的请求参数,若含有中文,则会出现中文乱码问题。Sprimg对万请求参数中的中文乱码问题,给出了专门的字符集过滤器:spring-web-4.2.1.RELEASE.jar的org.springframework.web.filter 包下的CharacterEncodingFilter类。
(1)解决方案
在web.xml中注册字符集过滤器,即可解决Spring的请求参数的中文乱码问题。不过,最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。
在22基础上进行修改
只改web.xml文件
添加注册字符集过滤器

  <!-- 注册字符集过滤器 -->
  <filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  	<init-param>
  		<param-name>forceEncoding</param-name>
  		<param-value>true</param-value>
  	</init-param>
  </filter>
  
  <filter-mapping>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

3.3.3校止请求参数名

@RequestParam所谓校正请求参数名,是指若请求URL所携带的参数名称与处理方法中指定的参数名不相同时,则需在处理方法参数前,添加一个注解@RequestParam(“请求参数名”),指定请求URL所携带参数的名称。该注解是对处理器方法参数进行修饰的。
@RequestParam()有三个属性:

>value:指定请求参数的名称。
>required:指定该注解所修饰的参数是否是必须的,boolean类型。若为true,则表示请求中所携带的参数中必须包含当前参数。若为false,则表示有没有均可。
>defaultValue:指定当前参数的默认值。若请求URI中没有给出当前参数,则当前方法参数将取该默认值。即使required为true,且URI中没有给出当前参数,该处理器方法参数会自动取该默认值,而不会报错。

>/23-receiveParameters-requestParam
1、修改index页面
将name改为pname 将表单中的参数名改为与处理类中传入参数名不相同

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	
	<body>
		<form action="${pageContext.request.contextPath }/test/register.do" method="POST">
			姓名:<input type="text" name="pname"/><br>
			年龄:<input type="text" name="age"/><br>
			<input type="submit" value="注册"/>
		</form>
	</body>
</html>

2、修改处理器类myController
使用@RequestParam

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/register.do")
	public ModelAndView doRegister(@RequestParam("pname") String name, int age) {//校正请求参数名
		System.out.println("name = " + name);
		System.out.println("age = " + age);
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("name", name);//其实就是放在request域空间
		mv.addObject("age", age);
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
}

3.3.4整体参数接收

将处理器方法的参数定义为一个对象,只要保证请求参数名与这个对象的属性同名即可。
参数名称中不用写为“对象.属性”的形式。
/24-receiveParameters-Object
1、定义Student类
这里定义name和age两个私有属性,写get、set、toString方法,就不放代码了。
2、修改处理器
这回是将输入的学生信息当作一个学生对象来传入,调用get方法得到。再放入视图页面。

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/register.do")
	public ModelAndView doRegister(Student student) {//校正请求参数名
		System.out.println("name = " + student.getName());
		System.out.println("age = " + student.getAge());
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("student", student);//其实就是放在request域空间
		mv.setViewName("/WEB-INF/jsp/welcome.jsp");
		
		return mv;
	}
}

3、修改视图页面

<html>
	<head>
		<title>welcome page</title>
	</head>
	
	<body>
		student = ${student }<br>
	</body>
</html>

3.3.5 域属性参数的接收

所谓域属性,仰对象属性。当请求参数中的数据为某类对象域属性的属性值时,要求请求参数名为“域属性名.属性”。
/25-receiveParameters-ObjectProperty
1、再定义一个学校类
赋值sname、address私有属性,和方法。
2、在学生类中添加学校域属性
添加school的get、set方法,重写toString

public class Student {
	private String name;
	private int age;
	private School school;

3、修改index页面

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	<body>
		<form action="${pageContext.request.contextPath }/test/register.do" method="POST">
		<!-- 整体接收时,要求表单参数名与对象属性名相同 -->
			姓名:<input type="text" name="name"/><br>
			年龄:<input type="text" name="age"/><br>
			学校:<input type="text" name="school.sname"/><br>
			地址:<input type="text" name="school.address"/><br>
			<input type="submit" value="注册"/>
		</form>
	</body>
</html>

3.4处理器方法的返回值

使用@Controller注解的处理器的处理器方法,其返回值常用的有四种类型:

>第一种:ModelAndView
>第二种:String
>第三种:无返回值 void>第四种:返回自定义类型对象
根据不同的情况,使用不同的返回值。

3.4.1返回ModelAndView

若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回ModelAndView比较好。当然,若要返回ModelAndView,则处理器方法中需要定义ModelAndView对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的Ajax异步响应),此时若返回ModelAndView,则将总是有一部分多余:要么Model多余,要么View多余。即此时返回ModelAndView将不合适。

3.4.2返回String

处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。
(1)返回内部资源逻辑视图名
/27-returnString-internal
1、内部资源welcome.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>welcome page</title>
	</head>
	
	<body>
		welcome page
	</body>
</html>

2、web和index不变
3、直接修改处理器类MyController
直接返回内部资源welcome内容:welcome page

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/some.do")
	public String doFirst() {

		return "/WEB-INF/jsp/welcome.jsp";
	}

}

(2)返回View对象名
若要跳转的资源为外部资源,则视图解析器可以使用BeanNameViewResolver,然后在配置文件中再定义一些外部资源视图View对象,此时处理器方法返回的字符串就是要跳转资源视图View的名称。当然,这些视图View对象,可以是内部资源视图View对象。
/29-returnString-external
1、修改配置文件
定义外部资源视图、注册视图解析器

                <!-- 定义一个内部资源视图 注意这里是后台路径加斜杠 -->
	<bean id="internalResource" class="org.springframework.web.servlet.view.JstlView">
		<property name="url" value="/WEB-INF/jsp/welcome.jsp"/>
	</bean>
        <!-- 定义两个外部资源视图 -->
	<bean id="taobao" class="org.springframework.web.servlet.view.RedirectView">
		<property name="url" value="http://www.taobao.com"/>
	</bean>
	<bean id="jd" class="org.springframework.web.servlet.view.RedirectView">
		<property name="url" value="http://www.jd.com"/>
	</bean>
	<!-- 注册视图解析器 -->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
        
       <!-- 默认的视图解析器优先级最低 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<property name="suffix" value=".jsp"/>
	</bean> 
        
	<!-- 注册组件扫描器 -->
	<context:component-scan base-package="com.bjpowernode.handlers"/>

2、修改处理器
返回对应外部资源视图的id

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/some.do")
	public String doFirst() {
		//视图对象名字
		return "taobao";
	}
}

3.4.3 返回void

(1)通过ServletAPI传递数据并完成跳转
通过在处理器方法的参数中放入的ServletAPI参数,来完成资源跳转时所要传递的数据及跳转。
可在方法参数中放入AttpServletRequest 或HttpSession,使方法中可以直接将数据放入到request、session的域中,也可通过 request.getServletContext()获取到ServletContext,从而将数据放入到application的域中。
可在方法参数中放入HttpServletRequest 与HttpServletResponse,使方法可以完成请求转发与重定向。注意,重定向是无法完成对/WEB-INF/下资源的访问的。

>请求转发:equest.getRequestDispatcher(“目标页面").forward(request,response);
>重定向:response.sendRedirect(“目标页面”);

1、修改处理器
在这里插入图片描述
2、修改SpringMVC配置文件
修改SpringMVC配置文件,删除视图解析器的配置。因为处理器方法无视图返回,所以也就无需视图解析器了。
在这里插入图片描述
(2)AJAX响应
若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。
例如,对于AJAX的异步请求的响应。
1、导入Json的包
2、引入Jquery库
/30-returnVoid-ajax
1、定义index页面
由两部分构成:一个是button ,用于提交AJAX请求;一个是script用于处理AJAX请求。

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	<script type="text/javascript" src="js/jquery-3.4.0.js"></script>
	<script type="text/javascript">
		$(function(){
			$("button").click(function(){
				$.ajax({
					url:"test/myAjax.do",
					data:{
						name:"张三",
						age:23
					},
					success:function(){
						alert(data);
					}
				});
			});
		});
	
	</script>
	
	<body>
		<button>提交Ajax请求</button>
	</body>
</html>

2、修改处理器类
MyController处理器对于AJAX请求中所提交的参数,可以使用逐个接收的方式,也可以以对象的方式整体接收。只要保证AJAX请求参数与接收的对象类型属性同名。
这里没有学AJAX,暂时搁浅。

3.4.4 返回Object

处理器方法也可以返回Object对象。但返回的这个Object对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
返回Object对象,需要使用@ResponseBody注解,将转换后的JSON数据放入到响应体中。
A、导入Jar包
由于返回Object数据,一般都是将数据转化为了JSON对象后传递给浏览器页面的。而这个由Object 转换为JSON,是由Jackson工具完成的。所以需要导入Jackson的相关Jar包。
B、注册注解驱动
将Object 数据转化为JSON数据,需要由Http消息转换器HttpMessageConverter完成。
而转换器的开启,需要由mvc:annotation-driven/来完成。
当Spring 容器进行初烯化过程中,在mvc:annotation-driven/处创建注解驱动时,默认创建了七个HttpMessageConverter对象。也就是说,我们注册mvc:annotation-driven/,就是为了让容器为我们创建 HttpMessageConverter对象。
(2)返回数值型对象
/31-returnObject-number
1、修改index页面
由两部分构成:一个是button ,用于提交AJAX请求;一个是script用于处理AJAX请求。

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	<script type="text/javascript" src="js/jquery-3.4.0.js"></script>
	<script type="text/javascript">
		$(function() {
			$("button").click(function() {
				$.ajax({
					url:"test/myAjax.do",

					success:function(data){
						alert(data);
					}
				});
			});
		});
	
	</script>
	
	<body>
		<button>提交Ajax请求</button>
	</body>
</html>

2、修改处理器类
返回一个数字

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/myAjax.do")
	@ResponseBody	//将返回的数据放入到响应体中
	public Object doAjax() {
	
		return "abcde";
		
	}
}

3、修改springmvc配置文件
注册MVC注解驱动
将Object 数据转化为JSON数据,需要由Http消息转换器HttpMessageConverter完成。
而转换器的开启,需要由mvc:annotation-driven/来完成。

	<!-- 注册组件扫描器 -->
	<context:component-scan base-package="com.bjpowernode.handlers"/>
	
	<!-- 注册MVC注解驱动 -->
	<mvc:annotation-driven/>

(3)返回字符串对象
若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但若返回的字符串中带有中文字符,则接收方页面将会出现乱码。此时需要使用@RequestMapping的produces属性指定字符集。/32-returnObject-String

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping(value="/myAjax.do", produces="text/html;charset=utf-8")
	@ResponseBody	//将返回的数据放入到响应体中
	public Object doAjax() {
	
		return "China北京";
		
	}
}

(4)返回自定义类型对象
返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换为JSON格式的数据发送给浏览器的。
由于转换器底层使用了Jackson转换方式将对象转换为JSON数据,所以需要导入Jackson的相关Jar包。
1、定义学生类
name、age
2、修改处理器
返回学生对象

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/myAjax.do")
	@ResponseBody	//将返回的数据放入到响应体中
	public Object doAjax() {
	
		return new Student("张三", 23);
		
	}
}

3、修改index页面

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	<script type="text/javascript" src="js/jquery-3.4.0.js"></script>
	<script type="text/javascript">
		$(function() {
			$("button").click(function() {
				$.ajax({
					url:"test/myAjax.do",

					success:function(data){
						alert(data.name + " " + data.age);
					}
				});
			});
		});
	
	</script>
	
	<body>
		<button>提交Ajax请求</button>
	</body>
</h

(5)返回Map集合
/34-returnObject-map
1、修改处理器

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/myAjax.do")
	@ResponseBody	//将返回的数据放入到响应体中
	public Object doAjax() {
		Map<String, Student> map = new HashMap<String, Student>();
		map.put("stu1", new Student("张三", 23));
		map.put("stu2", new Student("李四", 24));
		
		return map;
		
	}
}

2、修改index页面

<html>
	<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	<script type="text/javascript" src="js/jquery-3.4.0.js"></script>
	<script type="text/javascript">
		$(function() {
			$("button").click(function() {
				$.ajax({
					url:"test/myAjax.do",

					success:function(data){
						alert(data.stu1.name + "   " + data.stu1.age);
						alert(data.stu2.name + "   " + data.stu2.age);
					}
				});
			});
		});
	
	</script>
	
	<body>
		<button>提交Ajax请求</button>
	</body>
</html>

(6)返回List集合

@org.springframework.stereotype.Controller //表示当前类是一个处理器
@RequestMapping("/test")		//命名空间 会帮助你自动拼接,所以不用考虑hello等加不加斜杠了
public class MyController {
	
	@RequestMapping("/myAjax.do")
	@ResponseBody	//将返回的数据放入到响应体中
	public Object doAjax() {
	
		List<Student> list= new ArrayList<Student>();
		list.add(new Student("张三", 23));
		list.add(new Student("李四", 24));
		
		return list;
		
	}
}
<head>
	
		<title>My JSP 'index.jsp' starting page</title>
	</head>
	<script type="text/javascript" src="js/jquery-3.4.0.js"></script>
	<script type="text/javascript">
		$(function() {
			$("button").click(function() {
				$.ajax({
					url:"test/myAjax.do",

					success:function(data){
						$(data).each(function(index){
							alert(data[index].name + " " + data[index].age);
						});
					}
				});
			});
		});
	
	</script>
	
	<body>
		<button>提交Ajax请求</button>
	</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值