【SpringMVC】SpringMVC各参数使用方法、put和delete的使用、比Servlet的优势

SpringMVC入门基础

1.SpringMVC工作流程

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结尾的请求

 

2.springmvc配置文件的路径

 

(1)指定springmvc配置文件的路径:

 <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:springmvc.xml</param-value>
 </init-param>

一般使用这种方式指定路径。

(2)指定springmvc配置文件的路径,如果要省略,必须放到 默认路径:并且命名必须按照servletname的值-servlet.xml
/WEB-INF/servetname的值-servlet.xml

例如:
/WEB-INF/springDispatcherServlet-servlet.xml

/WEB-INF/AAA-servlet.xml

映射是 去匹配@RequestMapping注解,可以和方法名、类名不一致
通过method指定 请求方式(get  post  delete put)
    @RequestMapping(value="welcome",method=RequestMethod.POST)//映射


3.设置name="xxxx"的情况:前台必须传个name为xxxx的参数过来。

@RequestMapping(value="welcome",method=RequestMethod.POST,params ={"name2=zs","age!=23"})//映射

name2:必须有name为"name2"参数

age!=23 :    a.如果有name为"age",则age值不能是23
                     b.没有age
!name2  :不能name为"name2"的属性

 

4.ant风格的请求路径
?  单字符
*  任意个字符(0或多个)
** 任意目录
@RequestMapping(value="welcome3/**/test")
接受示例:

a href="welcome3/abc/xyz/abccc/test"

 

5.利用PathVariable获取动态参数

<a href="handler/welcome5/zs">...</a>
通过@PathVariable获取动态参数

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


6.REST风格 :软件编程风格

Springmvc:  
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处理不同的请求。


7.过滤器中 处理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);
            }
        }

        filterChain.doFilter(requestToUse, response);
    }


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

 

8.RequestParam

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

required属性是否为必须的;

defaultValue属性的默认值;

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

required=false:该属性 不是必须的。
defaultValue="23":默认值23

 

9.获取请求头信息 @RequestHeader
public String  testRequestHeader(@RequestHeader("Accept-Language")  String al  ) {
       
通过@RequestHeader("Accept-Language")  String al   获取请求头中的Accept-Language值,并将值保存再al变量中 

 

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


11.SpringMVC处理各种参数的流程/逻辑小结:
请求:  前端发请求a-> @RequestMappting("a") 
处理请求中的参数xyz:
    @RequestMappting("a") 
    public String  aa(@Xxx注解("xyz")  xyz)
    {

    }

12.SpringMVC的强大之处

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

原始采用servlet时是如下方式获取参数的,显得非常繁杂冗余。

	String name = 	request.getParameter("name");
		int age= Integer.parseInt(request.getParameter("age")s)	;
		String haddrss = 	request.getParameter("homeaddress");
		String saddress = 	request.getParameter("schooladdress");
		Address address = new Address();
		address.setHomeAddress(haddrss);
		address.setSchoolAddress(saddress);
		
		Student student = new Student();
		student.setName(name);
		student.setAddress(address);
        ......

而通过使用SpringMVC,前端只需特别留意有属性里面有对象的情况即可,采用address.homeAddress表示。

<form action="handler/testObjectProperties">
		id:<input name="id" type="text"/>
		name:<input name="name" type="text"/>
		家庭地址:<input name="address.homeAddress" type="text"/>
		学校地址:<input name="address.schoolAddress" type="text"/>
		<input value="提交" type="submit">
</form>

MVC部分也是很简洁,只需在方法中补输入参数(用对象的方式) Student student

@RequestMapping(value="testObjectProperties")
	public String testObjectProperties(Student student) {		
        System.out.println(student.getId());
		return "success";
    }

13.在SpringMVC中使用原生态的Servlet API  :

直接将 servlet-api中的类、接口等 写在springMVC所映射的方法参数中即可:

以HttpServletRequest为例:

 @RequestMapping(value="testServletAPI")
        public String testServletAPI(HttpServletRequest  request,HttpServletResponse response) {
            System.out.println(request);
            return "success" ;
        }

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值