1. 在springmvc中使用servlet对象
控制器方法上加入request, response, session类型的参数
springmvc框架会把这些对象准备好作为方法参数传入
@RequestMapping("/s1")
public String s1(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
}
还可以用@CookieValue注解获取cookie的值
@RequestMapping("/s2")
// @CookieValue("user") 含义是到请求中找一个名为user 的cookie
public String s2(@CookieValue("user") String abc ) {
System.out.println("user cookie的值是: " + abc);
return "hello";
}
2. spring-mvc中的重定向
在视图名前面添加 `redirect:`,这时候springmvc就会把字符串当做重定向进行跳转,而不是再通过视图解析器进行解析
1) 使用session传值
优点:信息安全、对象类型可以复杂
缺点:会占用服务器内存
@RequestMapping("/c1")
public String c1(HttpSession session) {
System.out.println("c1....");
// name=zhangsan 希望name传递给c2使用
session.setAttribute("name", "zhangsan");
return "redirect:/c2";
}
@RequestMapping("/c2")
public String c2(HttpSession session) {
System.out.println("c2....");
System.out.println("接收name:" +session.getAttribute("name"));
session.removeAttribute("name"); // 用完后及时清除
return "hello";
}
2) 利用重定向地址后跟请求参数的方式
优点:不会占服务器内存,可以向站外地址传递参数
缺点:数据有大小限制、有安全问题、不能是复杂类型
@RequestMapping("/c1")
public String c1() {
System.out.println("c1....");
// name=zhangsan 希望name传递给c2使用
return "redirect:/c2?name="+"zhangsan";
}
@RequestMapping("/c2")
public String c2(String name) {
System.out.println("c2....");
System.out.println("接收name:" + name);
return "hello";
}
3) springmvc提供的方法
@RequestMapping("/c1")
// RedirectAttributes 由springmvc提供,专门在重定向时传参
public String c1(RedirectAttributes ra) {
System.out.println("c1....");
// ra.addAttribute("name", "张三"); // 使用了方法2
ra.addFlashAttribute("name","张三"); // 使用了方法1
return "redirect:/c2";
}
@RequestMapping("/c2")
public String c2(@ModelAttribute("name") String aaa) {
System.out.println("c2....");
System.out.println("接收name:" + aaa);
return "hello";
}
3. 管理异常
1) 传统方式管理异常
// 自己用try -catch 管理异常
@RequestMapping("/exception1")
public String e1() {
try {
int i = 1 / 0;
return "hello";
} catch (Exception e) {
return "error";
}
}
2) 使用@ExceptionHander
把它加在要捕获异常的方法之上
@ExceptionHandler(ArithmeticException.class)
public String catch1(ArithmeticException e) {
System.out.println("catch1: "+e.getMessage());
return "error";
}
注意:
1) 该方法只能捕获本控制器类出现的异常
2) 匹配异常类型时,会匹配一个最接近的异常类型
3) 一般来说,要做全局的异常处理 :
@ControllerAdvice 全局控制器的通知类
加在通知类上,这样当某个控制器出现异常时,先找本类的异常处理器,
如果找不到,那么再到通知类中找全局的异常处理器
4. 文件上传
1) 先创建jsp
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="username">
<input type="file" name="abc">
<input type="submit" value="提交">
</form>
2) 创建类
@RequestMapping("/upload")
public String upload(String username, MultipartFile abc) throws IOException {
System.out.println("原始名:"+abc.getOriginalFilename());
System.out.println("大小:"+abc.getSize());
System.out.println("类型:"+abc.getContentType());
// 把上传的文件保存到哪里
abc.transferTo(new File("d:\\"+abc.getOriginalFilename()));
return "hello";
}
3) 在spring.xml配置上传文件的解析器
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000"/>
</bean>
5. 与缓存的结合
1) 配置spring.xml
<!-- 缓存的管理器 -->
<bean id="cacheManager" class="org.springframework.cache.concurrent.ConcurrentMapCacheManager">
<!-- 管理缓存区域 -->
<property name="cacheNames">
<list>
<value>user</value>
<value>order</value>
<value>product</value>
</list>
</property>
</bean>
<!-- 启用缓存相关的注解及支持
@Cacheable
@CacheEvict
@CachePut
-->
<cache:annotation-driven/>
2) 使用注解
@Cacheable(cacheNames = "缓存名字") 加在方法上
检查缓存内容
如果缓存中没有,就把方法结果存入缓存,
如果缓存中有,就直接返回内容,不会执行方法
@CacheEvict(cacheNames = "缓存名字", allEntries = true) 加在方法上
让某个缓存的内容失效
@CachePut(cacheNames = "user") 加在方法上
总会执行方法,用方法的返回结果更新缓存
6. ajax
几个技术的统称, 实现了页面的局部刷新
a asynchronous (异步的请求 xhr)
j javascript
a and
x xml (返回响应的格式xml, json)
1) 创建XMLHttpRequest
var xhr = new XMLHttpRequest();
2) 发送请求
xhr.open("get|post|put|delete", 请求url地址, true|false);
xhr.send(); // 真正发送请求
同步请求和异步请求
open("请求方式", "url", 异步or同步)
true ==> 异步请求, send() 不会等待响应返回,请求发送后立刻结束
false ==> 同步请求 , send()会一直等待到响应返回后,send才会结束
3) 接收响应
xhr.responseText
异步请求下接收响应:
// 响应返回时会触发onload时间
xhr.onload = function(){
xhr.responseText
}
// 旧的响应事件
xhr.onreadystatechange() {
if(xhr.readyState==4) { // 当readyState属性值为4时才是响应触发的
xhr.responseText
}
}
4) 转换json
如果服务器返回的是json结果,需要用JSON.parse 将其转为js对象
var obj = JSON.parse(xhr.responseText)