spring-mvc (二)

本文深入探讨SpringMVC框架的高级应用,包括使用servlet对象、重定向、异常处理、文件上传、缓存整合及AJAX技术。通过具体代码示例,详细讲解如何在控制器中操作request、response和session,利用重定向传递参数,管理异常,实现文件上传,整合缓存,并介绍AJAX的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值