SpringMVC入门

深藏阁楼爱情的钟 2022-03-19 14:56 409阅读 0赞

1.jar导包
spring-aop.jar
spring-bean.jar
spring-context.jar
spring-core.jar
spring-web.jar

spring-webmvc.jar
commons-logging.jar

报错NoClassDefFoundError:缺少jar

2.第一个SpringMVC程序
Servet - Springmvc
jsp ->Servlet (Springmvc)->Jsp

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDU2OTk5MQ_size_16_color_FFFFFF_t_70

springmvc配置文件 springmvc.xml
选中常用的命名空间:beans aop context mvc

普通的servlet流程:
请求-url-pattern -交给对应的servlet去处理

如果现在想用springmvc,而不是普通的servlet,如何告知程序?-如何让springmvc 介入程序:
需要配置一个 Springmvc自带的servlet

通过以下配置,拦截所有请求,交给SpringMVC处理:

以下是web.xml文件中的配置:(其中contextConfigLocation是DispatcherServlet父类的一个属性,是用来指定springMvc.xml文件在哪里放着)

  1. <servlet>
  2. <servlet-name>springDispatcherServlet</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:springmvc.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springDispatcherServlet</servlet-name>
  12. <url-pattern>/</url-pattern>
  13. </servlet-mapping>

其中:

.action

/:一切请求 ,注意不是 /*
/user:拦截以 /user开头的请求
/user/abc.do :只拦截该请求
.action:只拦截 .action结尾的请求

项目中同时兼容 springMVC和Servlet

  1. <servlet-mapping>
  2. <servlet-name>springDispatcherServlet</servlet-name>
  3. <url-pattern>.action</url-pattern>
  4. </servlet-mapping>
  5. <servlet>
  6. <servlet-name>springDispatcherServlet</servlet-name>
  7. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  8. <init-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:springmvc.xml</param-value>
  11. </init-param>
  12. <load-on-startup>1</load-on-startup>
  13. </servlet>

通过

  1. <init-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:springmvc.xml</param-value>
  4. </init-param>

指定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获取动态参数

  1. public String welcome5(@PathVariable("name") String name ) {
  2. System.out.println(name);
  3. return "success" ;
  4. }

======================================

REST风格 :软件编程风格

Springmvc:
GET :查
POST :增
DELETE :删
PUT :改

普通浏览器 只支持get post方式 ;其他请求方式 如 delelte|put请求是通过 过滤器新加入的支持。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDU2OTk5MQ_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDU2OTk5MQ_size_16_color_FFFFFF_t_70 2

下面是web.xml 配置过滤器:springmvc实现 :put|post请求方式的步骤
a.增加过滤器

  1. <!-- 增加HiddenHttpMethodFilte过滤器:目的是给普通浏览器 增加 put|delete请求方式 -->
  2. <filter>
  3. <filter-name>HiddenHttpMethodFilte</filter-name>
  4. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>HiddenHttpMethodFilte</filter-name>
  8. <!--拦截全部请求-->
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>

下面是index.jsp文件

b.表单

  1. <form action="handler/testRest/1234" method="post">
  2. <input type="hidden" name="_method" value="DELETE"/>
  3. <input type="submit" value="删">
  4. </form>

i:必须是post方式
ii:通过隐藏域 的value值 设置实际的请求方式 DELETE|PUT

下面是handler.java文件

c.控制器

  1. @RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE)
  2. public String testDelete(@PathVariable("id") Integer id) {
  3. System.out.println("delete:删 " +id);
  4. //Service层实现 真正的增
  5. return "success" ;// views/success.jsp,默认使用了 请求转发的 跳转方式
  6. }

通过 method=RequestMethod.DELETE 匹配具体的请求方式

此外,可以发现 ,当映射名相同时@RequestMapping(value=”testRest),可以通过method处理不同的请求。

过滤器中 处理put|delete请求的部分源码:

  1. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  2. HttpServletRequest requestToUse = request;
  3. if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
  4. String paramValue = request.getParameter(this.methodParam);
  5. if (StringUtils.hasLength(paramValue)) {
  6. requestToUse = new HttpMethodRequestWrapper(request, paramValue);
  7. }
  8. }
  9. filterChain.doFilter(requestToUse, response);
  10. }

原始请求:request,改请求默认只支持get post header
但是如果 是”POST” 并且有隐藏域
则,过滤器 将原始的请求 request加入新的请求方式DELETE,并将原始请求 转为 requestToUse 请求(request+Delete请求)
最后将requestToUse 放入 请求链中, 后续再事情request时 实际就使用改造后的 requestToUse

===========================================

接收前端的参数:

@RequestParam(“uname”):接受前台传递的值,等价于request.getParameter(“uname”);

  1. <form action="handler/testParam" method="post">
  2. <input name="uname" type="text" />
  3. <input type="submit" value="查"/>
  4. </form>

前端提交的值在后端接收(通过@RequestParam注解) 和上面的@PathVariable类似:

@PathVariable:是REST风格传值,传的值是路径的一部分(如:action=”handler/testRest/1234”)

@RequestParam:普通传值。

  1. @RequestMapping(value="testParam")
  2. public String testParam(@RequestParam("uname") String name){
  3. //写法等同于
  4. //String name = request.getParameter("uname);
  5. System.out.println(name);
  6. return "success";
  7. }

另外:

  1. @RequestParam("uname") String name,@RequestParam(value="uage",required=false,defaultValue="23")

required = false: 该属性 不是必须的(传值或者不传值都可以)。
defaultValue=”23”:默认值 23

============================================

获取请求头信息 @RequestHeader

  1. public String testRequestHeader(@RequestHeader("Accept-Language") String al ) {
  2. System.out.println(al);
  3. return "success";
  4. }

通过@RequestHeader(“Accept-Language”) String al 获取请求头中的Accept-Language值,并将值保存在 al 变量中

通过mvc获取cookie值(JSESSIONID)
@CookieValue
(前置知识: 服务端在接受客户端第一次请求时,会给该客户端分配一个session (该session包含一个sessionId)),并且服务端会在第一次响应客户端时 ,请该sessionId 赋值 给 JSESSIONID 并传递给客户端的 cookie 中

  1. public String testRequestHeader(@CookieValue("JSESSIONID") String js ) {
  2. System.out.println(js);
  3. return "success";
  4. }

小结:
SpringMVC处理各种参数的流程/逻辑:
请求: 前端发请求a —> @RequestMappting(“a”)
处理请求中的参数xyz:

  1. @RequestMappting("a")
  2. public String aa(@Xxx注解("xyz") xyz)
  3. {
  4. }

================================================

使用对象(实体类Student)接受请求参数

  1. <form action="handler/testObjectProperties" method="post">
  2. id:<input name="id" type="text" />
  3. name:<input name="name" type="text" />
  4. 家庭住址:<input name="address.homeAddress" type="text" />
  5. 学校住址:<input name="address.schoolAddress" type="text" />
  6. <input type="submit" value="查"/>
  7. </form>

student属性必须和form表单的属性Name值一致(支持级联属性)

本例中student是个学生类。student属性名和

表单name值要一样

  1. @RequestMapping(value="testObjectProperties")
  2. public String testObjectProperties(Student student){
  3. System.out.println(student.getId()+","student.getName+","+student.getAddress().getHomeAddress()+","+student.getAddress().getSchoolAddress());
  4. return "success";
  5. }
  6. public class Address {
  7. private String homeAddress;
  8. private String SchoolAddress;
  9. public String getHomeAddress() {
  10. return homeAddress;
  11. }
  12. public void setHomeAddress(String homeAddress) {
  13. this.homeAddress = homeAddress;
  14. }
  15. public String getSchoolAddress() {
  16. return SchoolAddress;
  17. }
  18. public void setSchoolAddress(String schoolAddress) {
  19. SchoolAddress = schoolAddress;
  20. }
  21. }
  22. public class Student {
  23. private int id;
  24. private String name;
  25. private Address address;
  26. public int getId() {
  27. return id;
  28. }
  29. public void setId(int id) {
  30. this.id = id;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public Address getAddress() {
  39. return address;
  40. }
  41. public void setAddress(Address address) {
  42. this.address = address;
  43. }
  44. }

==============================================

在SpringMVC中使用原生态的Servlet API : HttpServletRequest :直接将 servlet-api中的类、接口等 写在springMVC所映射的方法参数中即可:

  1. @RequestMapping(value="testServletAPI")
  2. public String testServletAPI(HttpServletRequest request,HttpServletResponse response) {
  3. request.getParameter("uname") ;
  4. System.out.println(request);
  5. return "success" ;
  6. }

============================================

发表评论

表情:
评论列表 (有 0 条评论,409人围观)

还没有评论,来说两句吧...

相关阅读