详解ssm项目中转发、重定向、get以及post请求
1.转发和重定向的区别:
重定向是针对客户端的(意味着地址会出现在地址栏),转发是针对程序内部的跳转
ssm项目中对WEB-INFO资源的访问:
框架规定重定向是不能对WEB-INFO目录下的资源进行访问,也就是不对客户端开放,而对于转发到WEB-INFO目录下的资源属于程序内部的跳转,是允许的。
1.1.对于转发,有两种使用方式:
1.1.1.显示转发:不与视图解析器一起工作,就当项目中没有视图解析器
视图解析器规则:
<!-- 视图处理器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views"/>
<property name="suffix" value=".jsp"/>
</bean>
显示转发不受视图解析器规则制约
ModelAndView mv = new ModelAndView();
mv.setViewName("forword:/WEB-INF/view/show.jsp")
1.1.2.不加forword:转发:和视图解析器共同工作
ModelAndView mv = new ModelAndView();
mv.setViewName("/WEB-INF/view/show")
以上转发方式路径重复,根据视图解析器规则:
转发的真正路径为:/WEB-INF/views/WEB-INF/view/show.jsp(附:如果不配置视图解析器写上完整路径还是可以转发的:/WEB-INF/views/WEB-INF/view/show.jsp)
1.2.redirect重定向:
不与视图解析器一起工作,就当项目中没有视图解析器,不可访问WEB-INFO目录下的资源(否则会出现404错误)。
orther.jsp在webapp直接目录下
ModelAndView mv = new ModelAndView();
mv.setViewName("redirect:/orther.jsp")
如果使用response.sendRedirect()
,就要加上项目名,如下:
response.sendRedirect("/项目名/orther.jsp)
使用重定向功能,还能将前端传过来的参数封装在视图ModelAndView中的属性和值随重定向路径返回,如下:
ModelAndView mv = new ModelAndView();
mv.addObject("name",name);
mv.addObject("myage",age);
mv.setViewName("redirect:/orther.jsp")
//地址栏:http://localhost:8080/项目名/orther.jsp?myname=lisi&myage=22
视图时第一个请求里面的东西,在/orther.jsp不能通过${myname}
获取
ModelAndView mv = new ModelAndView();
mv.addObject("name",name);
mv.addObject("myage",age);
可以通过第二次请求(将第一次请求中Model里面数据转化为字符串附加到目标页面的后面,做get参数传递)http://localhost:8080/项目名/orther.jsp?myname=lisi&myage=22中获取:
在/orther.jsp可通过${param.myname}
获取地址中的参数值
2.get(查询操作)和post(大量数据;增删改操作)请求
get请求会将数据显示在地址栏,不安全,例如在controller的某个方法上@RequestMapping("/register.do",method=RequestMethod.GET)
会将前端传过来的数据显示在地址栏上,表单、Ajax,地址栏、超链接,src资源路径请求(主要是缓存优化)都是get请求,其中,表单、Ajax请求都可指定为post,在页面中指定的请求方式和在controller中指定的请求方式不一致会爆出405错误;@RequestMapping("/register.do")
,前端什么请求都可以,不会出错
3.接收请求参数以及参数回显
3.1.在controller类中,方法接收请求参数的办法有如下几种:
3.1.1.提交的域名称和处理方法的参数名一致
@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);
return "hello";
}
3.1.2.提交的域名称和处理方法的参数名不一致
//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
3.1.3.提交的是一个对象时,要求提交的表单域和对象的属性名一致 , 参数使用对象即可
public class User {
private int id;
private String name;
private int age;
//构造
//get/set
//tostring()
}
提交数据 : http://localhost:8080/项目名/user?name=lisi&id=1&age=15
@RequestMapping("/user")
public String user(User user){
System.out.println(user);
return "hello";
}
3.2.数据回显到前端的办法
3.2.1.ModelAndView
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");//转发,与视图解析器一起工作
return mv;
}
}
3.2.2.ModelMap
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("name",name);
System.out.println(name);
return "hello";
}
3.2.3.Model
@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "test";
}