SpringMVC中使用 servlet 的对象:(Request,Response,Session,Cookie)
springmvc已经帮我们封装好了这些对象,只需在方法参数上使用所需要的对象即可
@Controller
public class ServletController {
/**
* 只要在控制器方法上加入request,response,session类型的参数,springmvc框架会把这些对象准备好作为方法参数传入
* 建议不要直接在方法参数上使用 Servlet 的(request,response,session)对象
* @param request
* @param response
* @param session
* @return
*/
@RequestMapping("/s1")
public String s1(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println("获取实际请求路径:"+request.getRequestURI());
System.out.println("获取客户端的ip:"+request.getRequestURI());
System.out.println("response的对象:"+response);
response.addCookie(new Cookie("user","chen"));
System.out.println("session的对象:"+session);
return "hello";
}
}
SpringMVC页面转发:
服务器内部跳转(forward)和 客户端重定向(redirect)
1) 转发
(1) 转发到JSP页面: 请求处理方法返回字符串,默认使用服务器内部跳转 ( request.getRequestDispatcher("指定页面").forward(request,response) )
示例: return "hello"; (视图名: 视图解析器会根据视图名拼接成正确的访问路径 " /hello.jsp")
(2)转发到服务器内部的请求:在返回的字符串前面加入 “ forward:/ 路径名 ”
示例: return " forward:/ main ";( 在服务器内部跳转到名为 main 的请求处理方法中)
2)重定向
(1)重定向到 JSP页面:在返回字符串的前面加上 “ redirect:/xxx.jsp ”
示例:return " redirect:/xxx.jsp "
***注意:
由于客户端重定向(redirect)相当于在浏览器重新发一次请求,所以不能访问 WEB-INF 下的资源文件,而且资源文件必须写完整(xxx.jsp),因为此时的视图解析器不会将该字符串进行解析,拼接
(2)重定向到 Controller 上 : 在返回的字符串前面加上 “ redirect:/路径名 ”
示例: return " redirect:/main "; ( 客户端重定向到名为 main 的请求处理方法中 )
Spring MVC 传值:
方法一:使用session传值 :
优点:信息相对比较安全,可以传输任意类型的数据
缺点:每个session都会占用服务器的内存
测试代码:
@Controller
public class RedirectController {
/**
* 方法一: 利用 HttpServletResponse 对象的重定向
* session 传值:
* 优点: 安全性高,可传任意类型的数据
* 缺点: 每个session都会占用服务器的内存
*
* @param response
* @return
* @throws IOException
*/
@RequestMapping("/r1")
public String r1(HttpServletResponse response, HttpSession session) throws IOException {
System.out.println("r1");
// 一次会话之内有效
session.setAttribute("name","chen");
//response.sendRedirect("/r2");
// 在视图名前面添加 `redirect:`,这时候springmvc就会把字符串当做重定向进行跳转,而不是再通过视图解析器进行解析
return "redirect:/r2";
}
@RequestMapping("/r2")
public String r2(HttpSession session){
System.out.println("r2");
System.out.println(session.getAttribute("name"));
// 需要手动移除 session 的值
session.removeAttribute("name");
return "hello";
}
}
方法二: 利用重定向后面跟上请求参数的方法
优点: 不会占用服务器的内存,可以向站外地址传值
缺点: 信息不安全,暴露在地址栏后面,可以传输的数据类型和数据大小有限制
测试代码:
@Controller
public class RedirectController {
/**
* 利用重定向地址后跟请求参数的方式
* 优点: 不会占用服务器内存,可以向站外地址传参
* 缺点: 安全性不高,数据大小有限制,不能传 复杂的 数据类型
* @return
*/
@RequestMapping("/r3")
public String r3(){
System.out.println("r3");
return "redirect:/r4?username=zhangsan";
}
@RequestMapping("/r4")
public String r4(String username){
System.out.println("r4");
System.out.println("username: "+username);
return "hello";
}
}
方法三:使用 Spring MVC提供的传参的对象(RedirectAttributes):专门在重定向时传参,综合了上面两种方法
RedirectAttributes : 传参,专门在重定向时传参
@ModelAttributes: 接收值
方式一(重定向后面跟请求参数的方式): redirect.addAttribute("参数名",参数值);
方式二(使用session传值的方式):redirect.addFlashAttribute("参数名",参数值);
测试代码:
@Controller
public class RedirectController {
/**
* SpringMVC提供的重定向方法:结合了上面两种方式的传参方式
* RedirectAttributes : 传参,专门在重定向时传参
* @ModelAttributes: 接收值
* 方式一(重定向后面跟请求参数的方式): redirect.addAttribute("username","chen");
* 方式二(使用session传值的方式):redirect.addFlashAttribute("username","kobe");
*
* @param redirect
* @return
*/
@RequestMapping("/r5")
public String r5(RedirectAttributes redirect){
System.out.println("r5");
// 采用的是 重定向后面跟请求参数的方式
redirect.addAttribute("username","chen");
// 采用的是 session 的传值方式
redirect.addFlashAttribute("username","kobe");
return "redirect:/r6";
}
@RequestMapping("/r6")
public String r6(@ModelAttribute("username")String name){
System.out.println("r6");
System.out.println("username: "+name);
return "hello";
}
}
Spring MVC中的异常处理:
SpringMVC提供了两种方式
1)使用 SpringMVC提供的简单异常处理器 SimpleMapperingExceptionResolver (需要配合 .xml 文件来配置)
2)使用注解@ExceptionHandler( 用在方法上) 实现局部异常处理或使用注解@ControllerAdvice(类)实现全局统一处理异常
***注意:不建议在请求处理方法中写异常处理块(catch),因为这种处理方式非常繁琐,而且一旦改变异常处理方式, 需要修改大量的代码,耦合性较高
方式一: 使用 SimpleMapperingExceptionResolver 进行异常处理
1)在 spring.xml 文件中配置:
<!--
p:defaultErrorView="error":表示所有没有指定的异常,都跳转到默认异常处理页面 error.jsp
p:exceptionAttribute="ex" :表示异常处理页面中访问的异常对象变量名是 ex
exceptionMappings: 表示映射的异常,接受参数是一个 Properties
key:是异常类名, values:处理异常的页面
-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
p:defaultErrorView="error"
p:exceptionAttribute="ex"
>
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">error1</prop>
<prop key="java.lang.ArithmeticException">error2</prop>
</props>
</property>
</bean>
2)模拟异常的处理方法:
@RequestMapping("/testSimpleMapingExceptionResolver")
public String testSimpleMapingExceptionResolver(@RequestParam("i") int i){
String[] values=new String[10];
System.out.println(values[i]);
return "success";
}
3)error.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
错误页面!
<br>
${requestScope.ex.message}
</body>
</html>