Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。
通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
在接收到请求的之后,通过映射转到控制层(Control)进行一系列操作之后再进行页面跳转,而在控制层中,对于注解的使用是十分普遍的,无论是从请求页面获取数据,还是从控制层携带数据(Model)跳转、请求页面异常及控制层异常等处理,都可以通过使用注解的形式进行实现,SpringMVC的实现的功能其实和servlet是十分相似的,但功能更为强大。
spring-aop.jar
spring-bean.jar
spring-context.jar
spring-core.jar
spring-web.jar
spring-webmvc.jar
commons-logging.jar
而这次我直接利用建立maven的web项目加入依赖,而需要注意的是在使用(archetype)骨架模型的时候,建议使用有cocoon的那个webapp模型,可以在后面的web.xml配置中省去许多由于配置顺序所导致的一系列问题,而具体的相关问题可以看个人解决之后所写下的web.xml配置报错有关解决方案的博客。
<!--告诉系统Springmvc.xml的位置 -->
<!--name中的值是DispatcherServlet父类系中的一个属性值,
给该属性赋值就是确定Springmvc.xml的位置-->
<servlet>
<servlet-name>SpringDispatcherSer</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--1表示在项目启动时配置启动等级,越小启动越快-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--注意名字要对齐-->
<servlet-mapping>
<servlet-name>SpringDispatcherSer</servlet-name>
<url-pattern>/</url-pattern>
<!--/:代表所有请求-->
<!--/:一切请求 ,注意不是 /*-->
以上springMVC.xml的文件位置是在resources当中,而使用默认路径的配法如下:
默认路径配法:
< servlet>
< servlet-name>Springmvc< /servlet-name>
< servlet-class>org.springframework.web.servlet.DispatcherServlet servlet- class>
< load-on-startup>1< /load-on-startup>
< /servlet>
< servlet-mapping>
< servlet-name>Springmvc< /servlet-name>
< url-pattern>/< /url-pattern>
< /servlet-mapping>
注:
配置文件名:Springmvc-servlet.xml
默认路径下,配置文件的名称一定要是:servletname名-servlet.xml
如果不是,就会报错!
此时文件名为:Springmvc-servlet.xml并放在WEB-INF下。
<!--扫描注解-->
<context:component-scan base-package="org.handler,org.entity"></context:component-scan>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
使用到注解的地方都要添加到扫描当中才起作用,而视图解析器的作用在下面再说。
<!--index.jsp-->
<a href="handler/test">test</a>
//Control层
@Controller
@RequestMapping("handler")
public class handler {
@RequestMapping("test")
public String testHello(){
return "success";
}
注意不要在href="handler/test"中的handler前面加/,不然会报404,而IDEA补全是会前面添加/的,所以要注意一些。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
Success to visit SpringMVC!!!
</body>
</html>
之后就可以通过启动TomCat进行访问了。
而首先请求先是有web.xml中的配置被拦截,根据@RequestMapping注解中的path与请求的路径对应起来跳转至相应的方法当中,然后在方法返回之后,视图解析器会自动为"success"添加前缀"/views/“和后缀”.jsp",从而组成了跳转页面的路径,之后再跳转至相应的页面中去。
而@RequestMapping可以在类名前设置,也可以不添加设置,添加设置时,完整的请求路径是类名的@RequestMapping/方法的@RequestMapping。
通过设置@RequestMapping的参数,可以指定匹配@RequestMapping的条件
@RequestMapping(value=“welcome”,method=RequestMethod.POST)
该RequestMapping只能被POST提交方式的请求匹配到,而GET等方式不能。
//params是指定参数要有什么或则是什么值,或者后面不能有什么或什么值
@RequestMapping(value = “welcome/abc”,method = RequestMethod.POST,params = {“name=zs”,“age!=23”,"!head"})
//提交的表格当中,name栏的名字要为zs、没有age或则age栏不等于23、不能有head这个参数;
归纳一下:
设置name="xxxx"的情况:
params= {“name2=zs”,“age!=23”}
name2:必须有name="name2"参数
age!=23 : a.如果有name=“age”,则age值不能是23
b.没有age
!name2 :不能name="name2"的属性
3.通过网页中的headers限制访问:
当我们在不同浏览器中访问相同的页面时,通过F12可以发现不同浏览器中的请求头headers是不一样的,通过在RequestMapping设置相应的headers,可以限制一些浏览器访问:
@RequestMapping(value = “welcome2/abc”,headers = {“Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3”,“Accept-Encoding=gzip, deflate, br”})
以上是在第一次访问相应的谷歌浏览器的时候获得了相应的headers的Accept,设置到RequestMapping中,再次启动项目在火狐中点击相应的请求之后,直接报404了,而在谷歌浏览器中则可以正常访问。
? 单字符
*任意个字符(1或多个)
** 任意目录
@RequestMapping(value = “welcome3/*/abc”)
// welcome3/与/abc之间可以有1个或多个任意字符,如/welcome3/12332132321/abc和/welcome3/d/abc
@RequestMapping(value = “welcome4/**/abc”)
//welcome4/与/abc之间可以有任意个目录
@RequestMapping(value = “welcome5/a?c/abc”)
a与c之间可以为任意单字符