• SpringMVC(一)--基础、REST、@RequestParam、POST请求乱码等


    1.SpringMVC基本概述

    Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一

    Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架
    Spring MVC 通过一套 MVC注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
         用SpringMVC代替web层
         MVC是一种设计模式:
              M:model 模型:用来封装数据,比如javabean
              V:view 视图:用来显示数据
              C:controller:用于接收前端页面发送的请求,然后调用servlet层处理,拿到处理结果并将结果返回给前端界面
         SpringMVC相当于MVC中的C和V!
    支持 REST 风格的 URL 请求
    采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性
     
    2.建一个最基础的SpringMVC项目
    步骤:
    – 导 jar 包
    – 在 web.xml 中配置 DispatcherServlet
    – 加入 Spring MVC 的配置文件
    – 编写处理请求的处理器,并标识为处理器
    – 编写视图
    代码实现:
    ① 导jar包
    – commons-logging-1.1.3.jar
    – spring-aop-4.0.0.RELEASE.jar
    – spring-beans-4.0.0.RELEASE.jar
    – spring-context-4.0.0.RELEASE.jar
    – spring-core-4.0.0.RELEASE.jar
    – spring-expression-4.0.0.RELEASE.jar
    – spring-web-4.0.0.RELEASE.jar
    – spring-webmvc-4.0.0.RELEASE.jar
    ②  配置 .xml文件
       配置 DispatcherServlet :DispatcherServlet 默认加载 /WEB- INF/<servletName-servlet>.xml 的 Spring 配置文件,去Open Type中查DispatcherServlet
         
      <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
      <!-- 向服务器注册前端控制器 -->
    	<servlet>
    		<servlet-name>springDispatcherServlet</servlet-name>
    		<!--DispatcherServlet指的是SpringMVC的前端控制器,给服务器使用,创建servlet对象  -->
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<!-- 用于制定SpringMVC配置文件的路径以及名称 -->
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:springmvc.xml</param-value>
    		</init-param> 
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	<!-- Map all requests to the DispatcherServlet for handling -->
    	<!-- 用servlet-mapping制定请求映射的路径 -->
    	<servlet-mapping>
    		<servlet-name>springDispatcherServlet</servlet-name>
    		<!-- 用url-pattern指定拦截的请求路径 -->
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    
     新建springmvc.xml文件

    点击Next输入文件名springmvc.xml,再点Next,在以下三项前打勾√

    在Open Type中查找 InternalResourceViewResolver,获得其全路径

    在springmvc.xml文件中添加

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    

     在web.xml文件中可以不设置初始化参数,也就是不写<init-param>

    但是要将spring.xml文件改名为 springDispatcherServlet-servlet.xml,并移动到WEB-INF目录下

     ③ 编写jsp页面和controller类
    @RequestMapping(value="/sayHello",method=RequestMethod.GET,params={"username","pwd!=123"})
    public String SUCCESS(){
    	System.out.println("111");
    	return "success";
    }
    

    @RequestMapping()可以定义在类上,也可以定义在方法上

    –     类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
    –     方法处:提供进一步的细分映射信息。相对于类定义处的 URL

    @RequestMapping 的 value、method、params 及 heads 分别表示请求URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射 更加精确化

    params表示及含义

    –     param1: 表示请求必须包含名为 param1 的请求参数
    –     !param1: 表示请求不能包含名为 param1 的请求参数
    –     param1 != value1: 表示请求可以不包含名为 param1 的请求参数,若包含的话其值不能为 value1
    如上例代码中,必须要有’username‘参数,’pwd‘参数可有可无,若有的话不能为‘123’
     
    使用 @RequestMapping 映射请求,Ant 风格资源地址支持 3 种匹配符:
         –     ?:匹配文件名中的一个字符
         –     *:匹配文件名中的任意字符
         –     **:** 匹配多层路径
        
    @RequestMapping 还支持 Ant 风格的 URL:
          – /user/*/createUser: 匹配  /user/aaa/createUser、/user/bbb/createUser 等 URL
          – /user/**/createUser: 匹配  /user/createUser、/user/aaa/bbb/createUser 等 URL
          – /user/createUser??:匹配   /user/createUseraa、/user/createUserbb 等 URL
     
     ④ 运行
     
    3.REST :Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。
      它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用.
           HTTP 协议里面,四个表示操作方式的动词:
        GET 用来获 取资源
        POST 用来新建资源
        PUT 用来更新资源
        DELETE 用来删除资源
      
    <a href="${pageContext.request.contextPath }/getOrderById/1">okok</a>
    	
    <form action="${pageContext.request.contextPath }/postOrderById/2" method="post">
    	<input type="submit" value="Submit"/>
    </form>
    
    <form action="${pageContext.request.contextPath }/putOrderById/3" method="post">
    	<input type="hidden" name="_method" value="put"/>
    	<input type="submit" value="Submit"/>
    </form>
    
    <form action="${pageContext.request.contextPath }/deleteOrderById/4" method="post">
    	<input type="hidden" name="_method" value="delete"/>
    	<input type="submit" value="Submit"/>
    </form>
    

    超链接<a>是get请求,浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。需要在form表单中添加隐藏域,name为‘method',value为’POST/DELETE'

    同时需要在web.xml文件中配置 HiddenHttpMethodFilter 

      <!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为PUT请求和DELETE请求 -->
      <filter>
      	<filter-name>hiddenHttpMethodFilter</filter-name>
      	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
      </filter>
      <filter-mapping>
      	<filter-name>hiddenHttpMethodFilter</filter-name>
      	<url-pattern>/*</url-pattern>
      </filter-mapping>
    
    @RequestMapping(value="/getOrderById/{id}",method=RequestMethod.GET)
    public String getOrderById(@PathVariable(value="id") Integer id){
    	//调用service层方法
    	System.out.println(id);
    	return SUCCESS;
    }
    
    @RequestMapping(value="/postOrderById/{id}",method=RequestMethod.POST)
    public String postOrderById(@PathVariable(value="id") Integer id){
    	//调用service层方法
    	System.out.println(id);
    	return SUCCESS;
    }
    
    @RequestMapping(value="/putOrderById/{id}",method=RequestMethod.PUT)
    @ResponseBody
    public String putOrderById(@PathVariable(value="id") Integer id){
    	//调用service层方法
    	System.out.println(id);
    	return SUCCESS;
    }
    
    @RequestMapping(value="/deleteOrderById/{id}",method=RequestMethod.DELETE)
    @ResponseBody
    public String deleteOrderById(@PathVariable(value="id") Integer id){
    	//调用service层方法
    	System.out.println(id);
    	return SUCCESS;
    }
    

     因为在tomcat8.0中不支持PUT和DELETE方法,所以需要@ResponseBody,否则405错误

    4.使用@RequestParam绑定请求参数值

    @RequestMapping(value="/testRequestParam",method=RequestMethod.POST)
    public String testRequestParam(@RequestParam(value="username") String name,@RequestParam(value="password",required=false,defaultValue="123456789") String password){
    	System.out.println(name+"---"+password);
    	return SUCCESS;
    }
    

     在jsp页面

    <form action="${pageContext.request.contextPath }/testRequestParam" method="post">
    	Username:<input type="text" name="username"/>
    	Password:<input type="password" name="password"/>
    	<input type="submit" value="Submit"/>
    </form>
    

     @RequestParam可以从jsp页面获取参数

    –     value:参数名,与请求参数的name属性值一致
    –     required:是否必须输入值,默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
    –     defaultVault:不传值时的默认值,传值后将不再显示默认值  
     
     5.POST请求乱码问题
    上个例子如果输入中文的话,会出现乱码问题
    所以需要在web.xml文件中配置<filter>
    <!-- 解决中文乱码问题 -->
      <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
      </filter>
      <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
      </filter-mapping>
    
     
  • 相关阅读:
    PHPStrom 转 VSCode 折腾记录
    vscode php 代码提示 自动完成
    Elasticsearch中文分词加拼音
    AutoMapper用法
    删除所有退出状态的容器
    Linux 安装Docker
    千里眼的修练方法--末法时代即将结束
    Visual NMP
    c#通过反射获取类上的自定义特性
    微信小程序学习笔记
  • 原文地址:https://www.cnblogs.com/lwj-0923/p/7406192.html
Copyright © 2020-2023  润新知