内容收集于网络,侵删。
1.修饰位置
1.1.修饰类
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。 它出现的目的是为了使我们的 URL 可以按照模块化管理:
例如:
账户模块:
/account/add
/account/update
/account/delete
...
订单模块:
/order/add
/order/update
/order/delete
属性:
红色的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。
1.2.修饰方法
请求 URL 的第二级访问目录。
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和 配置的一模一样。
例如:
params = {"accountName"},表示请求参数必须有 accountName
params = {"moeny!100"},表示请求参数中money不能是100。 headers:用于指定限制请求消息头的条件。
注意:
以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
2.示例
2.1.修饰位置示例
控制器代码 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * RequestMapping 注解出现的位置 */ @Controller("accountController") @RequestMapping("/account") public class AccountController { @RequestMapping("/findAccount") public String findAccount() { System.out.println("查询了账户。。。。"); return "success"; } } |
jsp代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <html> "http://www.w3.org/TR/html4/loose.dtd"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>requestmapping 的使用</title> </head> <body> <!-- 第一种访问方式 --> <a href="${pageContext.request.contextPath}/account/findAccount">查询账户</a> <br/> <!-- 第二种访问方式 --> <a href="account/findAccount">查询账户</a> <br/> 注意:当我们使用此种方式配置时,在 jsp 中第二种写法时,不要在访问 URL 前面加/,否则无法找到资源。 </body> </html> |
2.2.method 属性的示例
控制器代码:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 保存账户 * @return */ @RequestMapping(value="/saveAccount", method=RequestMethod.POST) public String saveAccount() { System.out.println("保存了账户"); return "success"; } |
jsp 代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- 请求方式的示例 --> <a href="account/saveAccount">保存账户,get请求</a> <br/> <form action="account/saveAccount" method="post"> <input type="submit" value="保存账户,post请求"> </form> <br/> 注意:当使用 get 请求时,提示错误信息是 405,信息是方法不支持 get 方式请求 |
2.3.params 属性的示例
控制器的代码:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 删除账户 * @return */ @RequestMapping(value="/removeAccount", params= {"accountName","money>100"}) public String removeAccount() { System.out.println("删除了账户"); return "success"; } |
jsp 中的代码:
1 2 3 4 5 6 7 8 9 |
<!-- 请求参数的示例 --> <a href="account/removeAccount?accountName=aaa&money>100">删除账户,金额 100</a> <br/> <a href="account/removeAccount?accountName=aaa&money>150">删除账户,金额 150</a> 注意:当我们点击第一个超链接时,可以访问成功。 当我们点击第二个超链接时,无法访问。 |
3.请求参数的绑定
3.1.绑定机制
表单中请求参数都是基于 key=value 的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。 例如:
1 |
<a href="account/findAccount?accountId=10">查询账户</a> |
中请求参数是:
accountId=10
1 2 3 4 5 6 7 8 9 10 |
/** * 查询账户 * @return */ @RequestMapping("/findAccount") public String findAccount(Integer accountId) { System.out.println("查询了账户。。。。"+accountId); return "success"; } |
支持的数据类型:
1)基本类型参数:
包括基本类型和 String 类型
2)POJO 类型参数:
包括实体类,以及关联的实体类
3)数组和集合类型参数 :
包括 List 结构和 Map 结构的集合(包括数组)
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
如果是基本类型或者 String 类型:
要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
如果是 POJO 类型,或者它的关联对象:
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型 ,有两 种方式:
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。 给 List 集合中的元素赋值,使用下标。
给 Map 集合中的元素赋值,使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解实现。
注意: 它还可以实现一些数据类型自动转换。内置转换器全都在:org.springframework.core.convert.support 包下。
3.2.参数绑定示例:基本类型和 String 类型作为参数
jsp 代码:
1 2 3 4 |
<!-- 基本类型示例 --> <a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a> |
控制器代码:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 查询账户 * @return */ @RequestMapping("/findAccount") public String findAccount(Integer accountId,String accountName) { System.out.println("查询了账户。。。。"+accountId+","+ ); return "success"; } |
3.3.参数绑定示例:POJO 类型作为参数
实体类代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * 账户信息 */ 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代码:
1 2 3 4 5 6 7 8 9 |
<!-- pojo 类型演示 --> <form action="account/saveAccount" method="post"> 账户金额:<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> |
控制器代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * 保存账户 * @param account * @return */ @RequestMapping("/saveAccount") public String saveAccount(Account account) { System.out.println("保存了账户。。。。"+account); return "success"; } |
3.4.参数绑定示例:POJO类中包含集合类型参数
实体类代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * 用户实体类 */ public class User implements Serializable { private String username; private String password; private Integer age; private List<Account> accounts; private Map<String,Account> accountMap; } |
jsp 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!-- 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> |
控制器代码:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 更新账户 * @return */ @RequestMapping("/updateAccount") public String updateAccount(User user) { System.out.println("更新了账户。。。。"+user); return "success"; } |
3.5.参数绑定示例:请求参数乱码问题
3.5.1.post 请求方式
在 web.xml 中配置一个过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<!-- 配置 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 的配置文件中可以配置,静态资源不过滤:
1 2 3 4 5 6 |
<!-- location表示路径,mapping表示文件,**-一个也可以-表示该目录下的文件以及子目录的文件 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/scripts/" mapping="/javascript/**"/> |
3.5.2.get 请求方式
tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml 配置文件,如下:
1 2 3 |
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> |
改为:
1 2 3 4 |
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/> |
如果遇到 ajax 请求仍然乱码,请把:
useBodyEncodingForURI="true"改为 URIEncoding="UTF-8" 即可。
3.6.参数绑定示例:自定义类型转换器
Jsp代码
1 2 3 4 |
<!-- 特殊情况之:类型转换问题 --> <a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a> |
控制器代码:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 删除账户 * @return */ @RequestMapping("/deleteAccount") public String deleteAccount(String date) { System.out.println("删除了账户。。。。"+date); return "success"; } |
当我们把控制器中方法参数的类型改为 Date 时:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 删除账户 * @return */ @RequestMapping("/deleteAccount") public String deleteAccount(Date date) { System.out.println("删除了账户。。。。"+date); return "success"; } |
异常提示:
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:
Failed to convert value of type 'java.lang.String' to required type
'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException:
Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2018-01-01';
nested exception is java.lang.IllegalArgumentException
3.6.1.第一步:定义一个类,实现 Converter 接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * 自定义类型转换器 */ public class StringToDateConverter implements Converter<String, Date> { /** * 用于把 String 类型转成日期类型 */ @Override public Date convert(String source) { DateFormat format = null; try { if(StringUtils.isEmpty(source)) { throw new NullPointerException("请输入要转换的日期"); } format = new SimpleDateFormat("yyyy-MM-dd"); Date date = format.parse(source); return date; } catch (Exception e) { throw new RuntimeException("输入日期有误"); } } } |
3.6.2.第二步:在 spring 配置文件中配置类型转换器
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- 配置类型转换器工厂 --> <bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!-- 给工厂注入一个新的类型转换器 --> <property name="converters"> <array> <!-- 配置自定义类型转换器 --> <bean class="自定义目录.StringToDateConverter"></bean> </array> </property> </bean> |
3.6.3.第三步:在 annotation-driven 标签中引用配置的类型转换服务
1 2 3 4 |
<!-- 引用自定义类型转换器 --> <mvc:annotation-driven conversion-service="converterService"/> |
3.7.参数绑定示例:使用 ServletAPI 对象作为方法参数
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
我们可以把上述对象 ,直接写在控制的方法参数中使用。
部分示例代码:
jsp 代码:
1 2 3 4 |
<!-- 原始 ServletAPI 作为控制器参数 --> <a href="account/testServletAPI">测试访问ServletAPI</a> |
控制器中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * 测试访问 testServletAPI * @return */ @RequestMapping("/testServletAPI") public String testServletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session) { System.out.println(request); System.out.println(response); System.out.println(session); return "success"; } |
end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2407.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设