配置开发
配置视图解析器
之前设置视图的方式一
返回字符串为详细路径
@RequestMapping(value = "/b")
public String ck(){
return "/WEB-INF/pages/success.jsp";
}
之前设置视图的方式二
返回ModelAndView用ModelAndView的setViewName设置详细路径
@RequestMapping(value = "/c")
public ModelAndView handleRequest(){
ModelAndView mv = new ModelAndView();
mv.setViewName("/WEB-INF/pages/success.jsp");
return mv;
}
这两种方式设置的都是详细路径使用很繁琐
springmvc.xml文件配置
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
这样配置后之前的路径就不需要写详细的路径了只需要写一个jsp的文件名称甚至连后缀jsp都不用写,因为视图解析器会帮忙补全
InternalResourceViewResolver类的全限定路径是固定的
prefix的意思是前缀,就是会帮我们在写的视图前面补上value里面的内容
suffix后缀,在后面补上value里面的内容
固有参数
HttpServletRequest
很好理解这个就是javaweb中学习的那个request
用于承载请求的数据
HttpServletResponse
javaweb中的response
用于承载返回的数据
HttpSession
获取的就是javaweb里的那个session
Model,Map,ModelMap
这三个类似于session是用于承载数据的
@RequestHeader
这个注解用于获取请求头中的数据
@RequestHeader String host
获取请求头中的host
返回值
ModelAndView
这个返回的是一个ModelAndView对象,对象内可以设置视图,添加传输的数据
void
可以任何值都不返回,但是那样就只能使用response响应请求了
String
这个可以用来返回一个视图
也可以返回一个json字符串
返回json
ajax请求
var jq=jQuery.noConflict();
jq(function () {
jq("#myBtn").click(function () {
var data = {
uname : "jelly",
age : "23",
p : {
name : "小新"
}
};
jq.ajax({
url: "${pageContext.request.contextPath}/springMvc/c",
type: "POST",
dataType: "json",
contentType: "application/json",
success: function (data) {
alert(data);
}
});
})
})
接收响应
@RequestMapping(value = "/h", produces = "text/html;charset=utf-8")
@ResponseBody
public String ck(){
return "jelly:女孩";
}
@ResponseBody将返回值放在ResponseBody中包装成json格式字符串响应
必须要在@RequestMapping增加属性produces = "application/json;charset=utf-8"不然中文回乱码
Object
返回值可以是任何数据类型,甚至可以是一个对象,springmvc都会默认转换成json字符串响应
请求
var jq=jQuery.noConflict();
jq(function () {
jq("#myBtn").click(function () {
jq.ajax({
url: "springMvc/h",
type: "POST",
dataType: "json",
contentType: "application/json",
success: function (data) {
console.log(data);
}
});
})
})
最好加上dataType: "json"设置请求到的数据为json
后台
@RequestMapping(value = "/h", produces = "application/json;charset=utf-8")
@ResponseBody
public Object cka(){
User user = new User();
user.setUname("jelly");
user.setAge(17);
return user;
}
请求转发和重定向
请求转发
又称为服务器内部跳转,一次请求,地址不会改变
默认的返回方式就是请求转发,就是说不对return进行特殊设置就是走请求转发
重定向
又称为服务器外部跳转,两次请求,地址会改变
在请求转发的地址前面加上redirect:就会使请求转发变为重定向
注意重定向不会走视图解析器,所以路径需要写全
注意写在model模型中的数据会通过拼接在地址后面来传递
不想这样的话,可以重定向另一个控制器方法,然后用另一个控制器方法来请求转发页面即可
还可以使用session传递数据
额外知识点:
自己在测试时候遇到的,如果重定向的页面在WEB-INF目录内,是不能访问到的,原因是WEB-INF目录的文件是受保护的不能通过路径获取,只能请求转发到。
封面画师:纯白可怜,图片id=78250907,有需自取
Q.E.D.