1.RequestMapping详解
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上 作用在类上:第一级的访问目录 作用在方法上:第二级的访问目录
注意:/ 表示应用的根目录开始,路径上不能写 /
RequestMapping的属性
path: 指定请求路径的url
value: value属性和path属性是一样的
method: 指定该方法的请求方式
params: 指定限制请求参数的条件
headers: 发送的请求中必须包含的请求头
package com.qf.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@Controller
//@RequestMapping//建立请求URl和处理方法之间的对应关系
@RequestMapping("user")//一级路径
public class UserController {
@RequestMapping("login")//二级路径
public ModelAndView login(){
//调用service层方法
String username = "rose";
//保存数据跳转页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username",username);
//跳转页面
modelAndView.setViewName("/index.jsp");
return modelAndView;
}
@RequestMapping(path = "/register",method = RequestMethod.POST,params = "id",headers = "host")
public void register(HttpServletRequest request){
String id = request.getParameter("id");
String host = request.getHeader("host");
System.out.println("register" + id);
System.out.println(host);
}
}
2.请求参数的绑定
绑定机制: 表单提交的数据都是k=v格式的 username=jack&password=123
SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 要求:提交表单的name和参数的名称是相同的
支持的数据类型 基本数据类型和字符串类型
实体类型(JavaBean)
集合数据类型(List、map集合等)
基本数据类型和字符串类型
提交表单的name和参数的名称是相同的,区分大小写
实体类型(JavaBean) 要求提交表单的name和JavaBean中的属性名称需要一致
如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性
给集合属性数据封装 list[index].属性名 map['key'].属性名
注意:如果请求参数是中文,可以在web.xml中配置Spring提供的字符集过滤器来解决中文乱码问题
如果对象的属性中有Date类型,页面输入参数格式是 2019/1/1 可以自动参数绑定,如果页面输入参数格式是 2019-1-1 则无法绑定,需要使用自定义类型转换器来解决.
表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。 如果想自定义数据类型转换,可以实现Converter的接口
1.创建日期转换类
//把字符串转换日期
public class StringToDateConverter implements Converter<String,Date>{
public Date convert(String source) {
// 判断
if(source == null){
throw new RuntimeException("请您传入数据");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
// 把字符串转换日期
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("数据类型转换出现错误");
}
}
}
2.修改springmvc.xml
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.qf.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>
另一种方法:只需要在实体类中的Date类型的属性上加:@DateTimeFormat(pattern = "yyyy-MM-dd") 即可
3.常用注解
RequestParam注解 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性 value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供
PathVariable注解 作用:拥有绑定url中的占位符的。url中有/delete/{id},{id}就是占位符 属性 value:指定url中的占位符名称
Jsp如下:
<a href="user/testPathVariable/10">testPathVariable</a>
Controller如下:
@RequestMapping(value="/testPathVariable/{uid}")
public String testPathVariable(@PathVariable(name="uid") String id){
System.out.println(id);
return "success";
}
Restful风格的URL 请求路径一样,可以根据不同的请求方式去执行后台的不同方法 restful风格的URL优点 结构清晰 符合标准 易于理解 扩展方便
4.不常用注解
RequestHeader注解 作用:获取指定请求头的值 属性 value:请求头的名称
Jsp如下:
<a href="user/testRequestHeader">RequestHeader</a>
Controller如下:
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header){
System.out.println(header);
return "success";
}
CookieValue注解 作用:用于获取指定cookie的名称的值 属性 value:cookie的名称
Jsp如下:
<a href="user/testCookieValue">CookieValue</a>
Controller如下:
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
System.out.println(cookieValue);
return "success";
}
5.响应数据和结果视图
返回值分类
返回字符串:String Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。 应用时可以设置参数类型为Model,使用Model对象调用addAttribute方法来存储数据。
返回值是void 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。 应用时可以设置参数类型为HttpServletRequest和HttpServletResponse,使用转发或者重定向来跳转页面
返回值是ModelAndView对象 ModelAndView对象是Spring提供的一个对象,可以调用addObject方法来保存数据以及调用setViewName方法来跳转页面.
使用forward关键字进行请求转发 return "forward:转发的JSP路径"
使用redirect关键字进行重定向(默认会把项目路径加上) return "redirect:重定向的JSP路径"
6.SpringMVC中ajax的使用
@RequestBody和@ResponseBody一般用于ajax中获取请求json类型的数据和返回响应json类型的数据
@RequestBody :用于获取请求体json的数据(注意:GET方式请求不可以) ajax中设置请求参数为json类型:contentType :application/json
@ResponseBody:用于响应json数据 前提是需要提前导入json的jar包依赖
1.DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而 不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置:
<!--前端控制器,哪些静态资源不拦截(springmvc.xml中)-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 设置html静态页面不拦截(web.xml中) -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- 设置所有静态资源不被拦截(springmvc.xml中),等同于上面的两个配置-->
<mvc:default-servlet-handler/>
2.在pom.xml中导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
3.编写html/jsp页面
<script type="application/javascript" src="js/jquery-1.8.3.js"></script>
<body>
<input type="button" value="发送ajax请求" id="btn">
</body>
<script type="application/javascript">
$(function () {
$("#btn").click(function () {
//测试@RequestBody
$.ajax({
type: "POST",
url: "testRequestBody",
contentType: "application/json;charset=UTF-8",
data: '{"id":"1001","name":"marry","password":"123"}',
//backData,status,xmlHttpRequest
success: function(backData,status,xmlHttpRequest){
alert( "id: " + backData.id );
alert( "name: " + backData.name );
alert( "password: " + backData.password );
},
error:function () {
alert("ajax报错...")
}
});
})
})
</script>
4.在Controller中添加方法
@RequestMapping("testRequestBody")
@ResponseBody
public User testRequestBody(@RequestBody User user){
System.out.println("--testRequestBody--");
System.out.println(user);
user.setId("1002");
user.setName("tom");
user.setPassword("789");
return user;
}
7.Json介绍
常用的Json框架:Jackson FastJson Gson
JavaBean序列化转换为Json格式,性能:Jackson > FastJson > Gson > Json-lib
Jackson常用注解
@JsonIgnore : 指定属性不返回 @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8") : 格式指定日期属性 @JsonProperty("别名") : 给属性指定别名