-
Spring需要导入的Jar包
1.jar
spring-aop.jar
spring-bean.jar
spring-context.jar
spring-core.jar
spring-web.jar -
SpringMvc框架需要导入的Jar包
spring-webmvc.jar
commons-logging.jar
报错NoClassDefFoundError:缺少jar
SpringMvc的意义
Servet - Springmvc
jsp ->Servlet (Springmvc)->Jsp
url
springmvc配置文件 springmvc.xml
选中常用的命名空间:beans aop context mvc
普通的servlet流程:
请求-url-pattern -交给对应的servlet去处理
如果现在想用springmvc,而不是普通的servlet,如何告知程序?-如何让springmvc 介入程序:
需要配置一个 Springmvc自带的servlet
通过以下配置,拦截所有请求,交给SpringMVC处理:
<servlet>
<servlet-name>springDispatcherServlet</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
其中:
<url-pattern>.action</url-pattern>
- /:一切请求 ,注意不是 /*
- /user:拦截以 /user开头的请求
- /user/abc.do :只拦截该请求
- .action:只拦截 .action结尾的请求
项目中同时兼容 springMVC和Servlet
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>.action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>springDispatcherServlet</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>
<load-on-startup>1</load-on-startup>
</servlet>
通过
指定springmvc配置文件的路径,如果要省略,必须放到 默认路径:
/WEB-INF/springDispatcherServlet-servlet.xml
映射是去匹配@RequestMapping注解,可以和方法名、类名不一致
通过method指定 请求方式(get post delete put)
@RequestMapping(value=“welcome”,method=RequestMethod.POST) //映射
-
设置name="xxxx"的情况:
params= {“name2=zs”,“age!=23”}name2:必须有name="name2"参数
age!=23 : a.如果有name=“age”,则age值不能是23
b.没有age
!name2 :不能name="name2"的属性 -
ant风格的请求路径
? 单字符
任意个字符(0或多个)
任意目录
@RequestMapping(value=“welcome3/**/test”)
接受示例:
a href=“welcome3/abc/xyz/abccc/test”
-
通过@PathVariable获取动态参数
public String welcome5(@PathVariable(“name”) String name ) {
System.out.println(name);
return “success” ;
} -
Springmvc: REST风格 :软件编程风格
-
GET : 查
-
POST :增
-
DELETE :删
-
PUT :改
-
-
普通浏览器 只支持get post方式 ;其他请求方式 如 delelte|put请求是通过 过滤器新加入的支持。
springmvc实现 :put|post请求方式的步骤
a.增加过滤器
<!-- 增加HiddenHttpMethodFilte过滤器:目的是给普通浏览器 增加 put|delete请求方式 -->
<filter>
<filter-name>HiddenHttpMethodFilte</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilte</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
b.表单
<form action="handler/testRest/1234" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" value="删">
</form>
i:必须是post方式
ii:通过隐藏域 的value值 设置实际的请求方式 DELETE|PUT
c.控制器
@RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE)
public String testDelete(@PathVariable("id") Integer id) {
System.out.println("delete:删 " +id);
//Service层实现 真正的增
return "success" ;// views/success.jsp,默认使用了 请求转发的 跳转方式
}
通过 method=RequestMethod.DELETE 匹配具体的请求方式
此外,可以发现 ,当映射名相同时@RequestMapping(value="testRest),可以通过method处理不同的请求。
过滤器中 处理put|delete请求的部分源码:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
requestToUse = new HttpMethodRequestWrapper(request, paramValue);
}
}
filter