springMVC_day2_02_基于注解的SpringMVC和注解对各种需求的支持

1)用于支持注解的配置
使用基于注解的配置可以省略很多操作,更方便。我们之前所看到的所有的xml配置,如果替换成基于注解只需要在spring的xml文件中做如下配置:
只留下资源过滤和视图解析器;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    <!-- 7.配置视图解析器 -->
    <!-- 作用:把controller设置的逻辑视图名字解析为一个真正的视图路径 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
		        <!-- 设置视图对jstl标签库的支持  -->
			<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
			<!-- 设置逻辑视图的前缀 -->
			<!-- 放到web-inf是为了安全 因为他下面的东西无法直接通过浏览器访问
			http://localhost:8888/springmvc/WEB-INF/isp/hello.isp(这个是不会访问到的)
			服务器内部跳转没有问题
			 -->
			<property name="prefix" value="/WEB-INF/jsp/"/>  
			<!-- 设置逻辑视图的后缀 -->
			<property name="suffix" value=".jsp"/>  
			<!-- /WEB-INF/jsp/hello.jsp -->
		</bean>  
		<!-- /**代表当前目录下的所有下好几级目录 -->
		<!-- mvc提供的专属标签,防止静态资源被调用 -->
	<!-- 	
	<mvc:resources mapping="/static/images/**" location="/static/images/"/>  
		<mvc:resources mapping="/static/js/**" location="/static/js/"/>  
		<mvc:resources mapping="/static/css/**" location="/static/css/"/>  -->
	            <mvc:default-servlet-handler/>
	           
</beans>
<mvc:annotation-driven/>

在Spring中,
处理器类可以使用 @Controller注解
业务逻辑层可以使用 @Service注解
数据持久层可以使用 @Repository注解

	如果在处理器上使用 @Controller注解,那么还需要在配置文件中指定哪个包下面的类使用了该注解:
	<context:component-scan base-package="com.briup.web.controller"></context:component-scan>

2)基于注解的Controller
使用注解后,就不需要再实现特定的接口,任意一个javaBean对象都可以当做处理器对象,对象中任意一个方法都可以作为处理器方法。
只需
在类上加上 @Controller注解
方法上加上 @RequestMapping注解
即可

	例如:
	web.xml中:
	<servlet>
		<servlet-name>SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-web-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>SpringMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	

	src下面的spring-web-mvc.xml中:
	<mvc:annotation-driven/>
	<context:component-scan base-package="com.briup.web.controller"></context:component-scan>
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
		<property name="prefix" value="/WEB-INF/jsp/"/>  
		<property name="suffix" value=".jsp"/>  
	</bean>


	自定义的Controller中:
	@Controller
	public class HomeController {
		@RequestMapping("/home")
		public ModelAndView home(){
			ModelAndView mv = new ModelAndView("index");
			return mv;
		}
	}


	如上代码,使用 @Controller表明HomeController类是一个处理器类,通过 @RequestMapping("/home")表明当url请求名为/home时,调用home方法执行处理,当处理完成之后返回ModelAndView对象。因为在spring-web-mvc.xml中配置了视图解析器的前缀和后缀,所以最后视图home.jsp被返回


3)基于注解的Controller的返回值
	1.返回ModelAndView,和之前一样

	2.返回String,表示跳转的逻辑视图名字,模型可以通过参数传过来
		@Controller
		public class HomeController {
			@RequestMapping("/home")
			public String home(Model model){
				model.addAttribute("msg", "hello world");
				return "index";
			}
		}
	
	3.声明返回类型为void
		可以通过参数获取request和response,分别使用服务器内部跳转和重定向,自己来决定要跳转的位置。
		@Controller
		public class HomeController {
			@RequestMapping("/home")
			public void home(HttpServletRequest request,HttpServletResponse response){
				String username = request.getParameter("username");
				response.setContentType("text/html;charset=utf-8");
				response.getWriter().write("hello world! "+username);
				//或者使用servlet的方式进行跳转/重定向
				
			}
		}
package com.briup.web.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

@Controller //作用将当前类初始化(也就是生成bean对象)
//告诉适配器这就是一个Controller  
public class TestAnnotationController {
	@RequestMapping("/test")  //相当于处理器
   public ModelAndView test(HttpServletRequest request ,HttpServletResponse response) {
	   System.out.println("TestAnnotationController  test()....");
	   ModelAndView mv = new ModelAndView("test");
	   return mv;
	   
   }
	@RequestMapping("/test2")  
	public String test2() {
		   System.out.println("TestAnnotationController  test2()....");
		   return "test";
		   
	   }
	@RequestMapping("/test3")  
	public void test3(HttpServletRequest request ,HttpServletResponse response) throws Exception {
		//使用这个方法路径就死的美美的了,所以最好用第二种
		String path ="/WEB-INF/jsp/test.jsp";
		request.getRequestDispatcher(path).forward(request, response);
		System.out.println("TestAnnotationController  test3()....");
		
	}
	@RequestMapping("/test4")  
	//虽然我不能在外部访问但是我可以写回去
	public void test4(HttpServletRequest request ,HttpServletResponse response) throws Exception {
		//使用这个方法路径就死的美美的了,所以最好用第二种
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("hello world! ");
		System.out.println("TestAnnotationController  test4()....");
		
	}
	@RequestMapping("/test5")  //相当于处理器,告诉如何访问这个Controller ,并访问的
    //是哪个方法
public String test5( Model model)  {
System.out.println("TestAnnotationController  test5()....");
model.addAttribute("name", "白占成");
return "test";
//如果想在传字符串视图的时候,传数据,就用这个
}
   }


5.Spring2.5中引入注解对控制器/处理器(controller/handler)支持
@Controller
用于标识是处理器类;
@RequestMapping
请求到处理器功能方法的映射规则;
@RequestParam
请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute
请求参数到命令对象的绑定;
@SessionAttributes
用于声明session 级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session 中
@InitBinder
自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;

6.Spring3引入了更多的注解,其中包含了对RESTful架构风格的支持
@CookieValue
cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader
请求头数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody
请求的body体的绑定
@ResponseBody
处理器功能处理方法的返回值作为响应体
@ResponseStatus
定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler
注解式声明异常处理器;
@PathVariable
请求URI 中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;

7.Spring3中引入的mvc命名空间
mvc这个命名空间是在Spring3中引入的,其作用是用来支持mvc的配置
需要在中声明出这个命名空间及其对应的schemaLocation中的值

<mvc:annotation-driven>
	自动注册基于注解风格的映射器和适配器:
	在spring2.5中是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter

在spring3中是RequestMappingHandlerMapping和RequestMappingHandlerAdapter.
同时还支持各种数据的转换器.

<mvc:interceptors>
		配置自定义的处理器拦截器,例如:
		<mvc:interceptors>
			<mvc:interceptor>
				<mvc:mapping path="/**"/>
				<ref bean="handlerInterceptor1"/>
			</mvc:interceptor>
		</mvc:interceptors>

mvc:view-controller
收到相应请求后直接选择相应的视图,例如:
<mvc:view-controller path="/hello" view-name=“test”></mvc:view-controller>
这里有个跳过去啥也不干的方法:

@RequestMapping("/test2")  
	public String test2() {
		   System.out.println("TestAnnotationController  test2()....");
		   return "test";
		   
	   }

这个配置直接就代替他了:

<mvc:view-controller path="/test6" view-name="test"/>

完后他们都会经过视图解析器:

<!-- 作用:把controller设置的逻辑视图名字解析为一个真正的视图路径 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
	        <!-- 设置视图对jstl标签库的支持  -->
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
		<!-- 设置逻辑视图的前缀 -->
		<!-- 放到web-inf是为了安全 因为他下面的东西无法直接通过浏览器访问
		http://localhost:8888/springmvc/WEB-INF/isp/hello.isp(这个是不会访问到的)
		服务器内部跳转没有问题
		 -->
		<property name="prefix" value="/WEB-INF/jsp/"/>  
		<!-- 设置逻辑视图的后缀 -->
		<property name="suffix" value=".jsp"/>  
		<!-- /WEB-INF/jsp/hello.jsp -->
	</bean>  

<mvc:resources>
	逻辑静态资源路径到物理静态资源路径的对应.例如:
	<mvc:resources mapping="/images/**" location="/images/"/>  
	<mvc:resources mapping="/js/**" location="/js/"/>  
	<mvc:resources mapping="/css/**" location="/css/"/> 

<mvc:default-servlet-handler>
	当在web.xml中DispatcherServlet使用<url-pattern>/</url-pattern> 映射的时候,会静态资源也映射了,如果配置了这个mvc标签,那么再访问静态资源的时候就转交给默认的Servlet来响应静态文件,否则报404 找不到静态资源错误。

8.@Controller和@RequestMapping注解

1)声明处理器
	@Controller
	public class HelloWorldController {
		
	}
2)映射处理器中的【功能处理方法】
@Controller
public class HelloWorldController {
	@RequestMapping("/home")
	public ModelAndView home(){
		ModelAndView mv = new ModelAndView("index");
		return mv;
	}
}

表明该方法映射的url路径为/home

3)@RequestMapping也可以写在处理器类上
@RequestMapping("/test")
@Controller
public class HomeController {
	@RequestMapping("/home")
	public ModelAndView home(){
		ModelAndView mv = new ModelAndView("index");
		return mv;
	}
}
表明该方法映射的url路径为/test/home
给所有映射提供命名空间

9.请求映射
假设浏览器发送了一个请求如下:
-------------------------------
POST /login HTTP1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en;q=0.8,zh;q=0.5,en-US;q=0.3
Connection: keep-alive
Cookie: JSESSIONID=DBC6367DEB1C024A836F3EA35FCFD5A2
Host: 127.0.0.1:8989
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
//下面的是请求体中的内容
username=tom&password=123
--------------------------------

http协议的请求格式如下:
---------------------------------
请求方法  URL(映射路径)  协议版本号
请求头信息
请求头信息
请求头信息
..
回车换行
请求正文
---------------------------------


从格式中我们可以看到【请求方法、URL、请求头信息、请求正文】这四部分一般是可变的,因此我们可以把请求中的这些信息在处理器的【功能处理方法】中进行的映射,因此请求的映射分为如下几种:
	URL路径映射
		使用URL映射到处理器的功能处理方法;
	请求方法映射限定
		例如限定功能处理方法只处理GET请求;
	请求参数(body)映射限定
		例如限定只处理包含username参数的请求;
	请求头映射限定
		例如限定只处理"Accept=application/json"的请求。

10.URL路径映射
1)普通URL路径映射
@RequestMapping(value="/test")
@RequestMapping("/hello")
注解中只出现一个参数且参数名为value的话,可以将参数名去掉
@RequestMapping(value={"/test", “/user/hello”})
多个URL路径可以映射到同一个处理器的功能处理方法。
测试连个test;
在这里插入图片描述在这里插入图片描述出现500错误,因此命名空间就有用了:
在这里插入图片描述在这里插入图片描述
这个时候两个路径都能访问了
2)URI模板模式映射
@RequestMapping(value="/users/{userId}")
{XXX}占位符, 请求的URL可以是"/users/123456"或"/users/abcd",之后可以通过@PathVariable可以提取URI模板模式中的{XXX}中的值
@RequestMapping(value="/users/{userId}/create")
这样也是可以的,请求的URL可以是"/users/123/create"
@RequestMapping(value="/users/{userId}/topics/{topicId}")
这样也是可以的,请求的URL可以是"/users/123/topics/123"
在这里插入图片描述直接访问出错:
在这里插入图片描述必须根点东西:而且只能是有一级,你不能在弄/
{XXX}占位符,没有任何意义,只是占位置
在这里插入图片描述还能拿到我们写到占位符的东西:
在这里插入图片描述在这里插入图片描述在这里插入图片描述只是拿的路径中的值,不是参数值,你要是两个名字对不到一块,就取不到值
在这里插入图片描述像这样就可以输入任意int 再输入crested:
在这里插入图片描述多路径:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
3)Ant风格的URL路径映射

@RequestMapping(value="/users/**")
			可以匹配"/users/abc/abc",但"/users/123"将会被【URI模板模式映射中的"/users/{userId}"模式优先映射到】
		@RequestMapping(value="/product/?")
			可匹配"/product/1"或"/product/a",但不匹配"/product"或"/product/aa";
			?代表有且只有一个字符
		@RequestMapping(value="/product*")
			可匹配"/productabc"或"/product",但不匹配"/productabc/abc";
			*代表0~n个字符
		@RequestMapping(value="/product/*")
			可匹配"/product/abc",但不匹配"/productabc";
		@RequestMapping(value="/products/**/{productId}")
			可匹配"/products/abc/abc/123"或"/products/123",也就是Ant风格和URI模板变量风格可混用;
			**代表所有的子路径

在这里插入图片描述在这里插入图片描述
直接test5 错 test5/1/1错 只能test5/2
若果改成/**就可以多级
在这里插入图片描述
?占一个字符,把1改成12就错了

	   }
	/* Ant和Restful风格联合使用*/
	@RequestMapping("test7/?/{name}")  
	public String test7(@PathVariable String name) {
		System.out.println("TestAnnotationController  test7()....");
		System.out.println("name  : "+name);
		return "test";
		
	}

在这里插入图片描述
在这里插入图片描述
多级:
在这里插入图片描述

4)正则表达式风格的URL路径映射
	从Spring3.0 开始支持正则表达式风格的URL路径映射,格式为{变量名:正则表达式},之后通过@PathVariable可以提取{XXX:正则表达式匹配的值}中的XXX这个变量的值。

	@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}")
		可以匹配"/products/123-1",但不能匹配"/products/abc-1",这样可以设计更加严格的规则。
	@RequestMapping(value="/user/{userId:^\\d{4}-[a-z]{2}$}")
		可以匹配"/user/1234-ab"
	
	注意:\d表示数字,但是\在java的字符串中是特殊字符,所以需要再加一个\进行转义即可
	(参照之前js的学习文档,和java的正则几乎一致,js正则中的一个/变为java中的俩个/即可)
		括号:
			[abc] 	查找方括号之间的任何字符。
			[^abc] 	查找任何不在方括号之间的字符。
			[0-9] 	查找任何从 0 至 9 的数字。
			[a-z] 	查找任何从小写 a 到小写 z 的字符。
			[A-Z] 	查找任何从大写 A 到大写 Z 的字符。
			[A-z] 	查找任何从大写 A 到小写 z 的字符。
			(red|blue|green) 	查找任何指定的选项。
		
		元字符:
			. 	查找单个任意字符,除了换行和行结束符.如果要表示.这个字符,需要转义
			\w 	查找单词字符。     字母 数字 _
			\W 	查找非单词字符。非 字母 数字 _
			\d 	查找数字。
			\D 	查找非数字字符。
			\s 	查找空白字符。
			\S 	查找非空白字符。
			\b 	匹配单词边界。
			\B 	匹配非单词边界。
			\0 	查找 NUL 字符。
			\n 	查找换行符。
			\f 	查找换页符。
			\r 	查找回车符。
			\t 	查找制表符。
			\v 	查找垂直制表符。

		量词:
			n+ 		匹配任何包含至少一个 n 的字符串。
			n* 		匹配任何包含零个或多个 n 的字符串。
			n? 		匹配任何包含零个或一个 n 的字符串。
			n{X} 	匹配包含 X 个 n 的序列的字符串。
			n{X,Y} 	匹配包含 X 到 Y 个 n 的序列的字符串。
			n{X,} 	匹配包含至少 X 个 n 的序列的字符串。
			n$ 		匹配任何结尾为 n 的字符串。
			^n 		匹配任何开头为 n 的字符串。
			?=n 	匹配任何其后紧接指定字符串 n 的字符串。
			?!n 	匹配任何其后没有紧接指定字符串 n 的字符串。


	正则表达式风格的URL路径映射是一种特殊的URI模板模式映射
	URI模板模式映射不能指定模板变量的数据类型,如是数字还是字符串;
	正则表达式风格的URL路径映射,可以指定模板变量的数据类型,可以将规则写的相当复杂。

这里数字做个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正确
在这里插入图片描述
在这里插入图片描述
错误
测试限制5个数:
在这里插入图片描述4个输入错误:
在这里插入图片描述只能是5个:
在这里插入图片描述在来一个:匹配以数字开头 111-aa
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值