springMVC整理(二)

  • RequestMapping 注解
    使用说明:

    • 作用:
      用于建立请求 URL 和处理请求方法之间的对应关系。
    • 出现位置:
      类上:
      请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
      它出现的目的是为了使我们的 URL 可以按照模块化管理:
    • 属性:
      value:用于指定请求的 URL。它和 path 属性的作用是一样的。
      method:用于指定请求的方式。
      params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
      例如:
      params = {“accountName”},表示请求参数必须有 accountName
      params = {“moeny!100”},表示请求参数中 money 不能是 100。
      headers:用于指定限制请求消息头的条件。
      注意:
      以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
  • 注意

         <a href="account/findAccount">查询账户</a>
    

    当我们使用此种方式配置时,在 jsp 中第二种写法时,不要在访问 URL 前面加/,否则无法找到资源。

  • 请求参数的绑定:参数都是基于 key=value 的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

    • 支持的数据类型:
      • 基本类型参数:
        • 包括基本类型和 String 类型
      • POJO 类型参数:
        • 包括实体类,以及关联的实体类
      • 数组和集合类型参数:
        • 包括 List 结构和 Map 结构的集合(包括数组)
          SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
    • 使用要求:
      • 如果是基本类型或者 String 类型:
        要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
      • 如果是 POJO 类型,或者它的关联对象:
        要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
      • 如果是集合类型,有两种方式:
        第一种:
        要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
        给 List 集合中的元素赋值,使用下标。
        给 Map 集合中的元素赋值,使用键值对。
        第二种:
        接收的请求参数是 json 格式数据。需要借助一个注解实现。
    • 例如:
      • 基本类型

        <a href="account/findAccount?accountId=10">查询账户</a>
        中请求参数是:
        accountId=10
        /**
        * 查询账户
        * @return
        */
        @RequestMapping("/findAccount")
        public String findAccount(Integer accountId) {
        	System.out.println("查询了账户。。。。"+accountId);
        	return "success";
        }
        这个10就自动封装到了accountId
        
      • 实体类

        实体类代码:
        /**
        * 账户信息
        */
        public class Account implements Serializable {
        	private Integer id;
        	private String name;
        	private Float money;
        	private Address address;
        	//getters and setters
        }
        
        /**
        * 地址的实体类
        */
        public class Address implements Serializable {
        	private String provinceName;
        	private String cityName;
        	//getters and setters
        }
        
        jsp 代码:
        <!-- pojo 类型演示 -->
        <form action="account/saveAccount" method="post">
        	账户名称:<input type="text" name="name" ><br/>
        	账户金额:<input type="text" name="money" ><br/>
        	账户省份:<input type="text" name="address.provinceName" ><br/>
        	账户城市:<input type="text" name="address.cityName" ><br/>
        	<input type="submit" value=" 保存 ">
        </form>
        
        控制器代码:
        /**
        * 保存账户
        * @param account
        * @return
        */
        @RequestMapping("/saveAccount")
        public String saveAccount(Account account) {
        	System.out.println("保存了账户。。。。"+account);
        	return "success";
        }
        
      • 集合类型

        实体类代码:
        /**
        * 用户实体类
        */
        public class User implements Serializable {
        	private String username;
        	private String password;
        	private Integer age;
        	private List<Account> accounts;
        	private Map<String,Account> accountMap;
        	//getters and setters
        	@Override
        	public String toString() {
        		return "User [username=" + username + ", password=" + password + ", age="
        		+ age + ",\n accounts=" + accounts
        		+ ",\n accountMap=" + accountMap + "]";
        	}
        }
        
        jsp 代码:
        <!-- POJO 类包含集合类型演示 -->
        <form action="account/updateAccount" method="post">
        	用户名称:<input type="text" name="username" ><br/>
        	用户密码:<input type="password" name="password" ><br/>
        	用户年龄:<input type="text" name="age" ><br/>
        	账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
        	账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
        	账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
        	账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
        	账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
        	账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
        	账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
        	账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
        	<input type="submit" value=" 保存 ">
        </form>
        
        控制器代码:
        /**
        * 更新账户
        * @return
        */
        @RequestMapping("/updateAccount")
        public String updateAccount(User user) {
        	System.out.println("更新了账户。。。。"+user);
        	return "success";
        }
        
  • 请求乱码问题
    post 请求方式:
    在 web.xml 中配置一个过滤器

    <!-- 配置 springMVC 编码过滤器 -->
    <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>
    	<!-- 启动过滤器 -->
    	<init-param>
    		<param-name>forceEncoding</param-name>
    		<param-value>true</param-value>
    	</init-param>
    </filter>
    
    <!-- 过滤所有请求 -->
    <filter-mapping>
    	<filter-name>CharacterEncodingFilter</filter-name>
    	<url-pattern>/*</url-pattern>
    </filter-mapping>
    
    在 springmvc 的配置文件中可以配置,静态资源不过滤:
    <!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/scripts/" mapping="/javascript/**"/>
    配置过滤器后,如果不设置静态资源,那么静态资源会无效
    
    get 请求方式:
    tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml
    配置文件,如下:
    <Connector connectionTimeout="20000"
    port="8080"
    protocol="HTTP/1.1" redirectPort="8443"/>
    改为:
    <Connector connectionTimeout="20000"
    port="8080"
    protocol="HTTP/1.1" redirectPort="8443"
    useBodyEncodingForURI="true"/>
    如果遇到 ajax 请求仍然乱码,请把:
    useBodyEncodingForURI="true"改为 URIEncoding="UTF-8"
    即可。
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值