今天实训的内容有点多而且也挺复杂,总结起来是比较吃力的,不巧今天感冒,鼻子难受了一天,身体超虚的情况下还是尽可能跟上老师的步伐,此刻咳嗽,流涕加脖子疼的我决定尽可能详尽的记录今天实训的所有内容,本来写博客的目的呢就是记录学习的过程,让以后查找起来有章可循,并且量化每个进步的过程,也能给未来的自己留点好的回忆吧。
SpringMVC第五种数据提交方式:
第五种:动态占位符提交数据
昨天总结了 SpringMVC里4种常见的数据提交方式.,今天老师讲了第五种:使用框架提供的一个注解@PathVariable,将请求url中的值作为参数进行收集,局限性在于这种数据提交的方式仅限于超链接。
<a href="${pageContext.request.contextPath}/admin/five/中国/66.action">
第五种:动态占位符提交数据</a>
@RequestMapping("/five/{name}/{age}")
public String five(@PathVariable(value = "name") String name,@PathVariable(value = "age") int age){
System.out.println(name+"-----"+age);
return "main";
}
这种数据提交的方式把要传递的数据放在请求action的url中,不同的是它是直接采用斜杠 / 把数据和请求隔开而不是一个问号,这就意味着数据也成了请求action不可分割的一部分。然后利用@PathVariable来解析每一@RequestMapping("/five/{name}/{age}")中的占位符。这样的处理,常常用在在分布式开发中,地址栏中提交的数据,是看不到的。
SpringMVC页面跳转的4大方式:
实际上,页面跳转的方式常常被分为两种,一种是转发,一种是重定向。
请求处理的过程是这样的:客户端首先发出一个请求,被服务器端(也就是我们的Controller)接收,服务器根据这个请求,找到对应的处理方法,这个请求处理方法完全决定了我的页面最终是请求转发到一个页面,还是请求转发到一个action,还是重定向到一个页面,还是重定向到一个action。
转发可以理解为,客户端的请求我服务器完全能够处理,服务器来进行转发,
转发和重定向的区别:
1)浏览器地址访问 ----->转发不改变,重定向改变
2)发送请求次数 ---->转发请求1次,重定向2次
3)是否可携带request()参数 ----->转发可以携带,重定向不可以携带
4)访问web-INF下资源---->转发可以访问 ,重定向不可以访问
SpringMVC实现文件上传:
1.导入jar包
commons-fileupload-1.2.2.jar 和 commons-io-1.3.2.jar
2.在Springmvc.xml文件中进行配置:
<bean id = "multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
3.利用form表单提交数据的方式进行文件上传,要注意修改enctype的值为multipart/form-data,这表示将默认的传送键值对的方式改为文件流的方式
<form action="${pageContext.request.contextPath}/admin/up.action"
method="post" enctype="multipart/form-data">
<p>图片:</p>
<input type ="file" name = "myfile">
<input type ="submit" value="上传">
</form>
4.然后进行控制器的编写。要实现文件的上传,控制器类要完成以下3个任务:
- 构建文件名,使用UUID起名,使用原始文件的后缀
- 指定服务器端存储的路径
- 进行文件流转存
使用UUID起名,是为了保证文件的名称的唯一性。而生成的UUID本身带有短横线 - ,我们需要去除:uuid.toString().replace("-", “”),并且呢,我们还需要提取出原文件的后缀名。比如原文件的全名叫做dog1.jpg,对于原文件的名称dog1我们并不关心,我们只想拿到他的后缀名(也就是他的类型),有了这个类型之后,我们就可以用去除短横线的UUID拼接这个后缀名,得到新的文件名称,这样一来既保证了文件名的唯一性又使得文件的类型不会改变。下面给出老师提供的一个工具类帮助我们定义好了以上功能的实现方法:
package com.sxau.demo.utils;
import java.util.UUID;
public class FileNameUtil {
//根据UUID生成文件名
public static String getUUIDFileName() {
UUID uuid = UUID.randomUUID();
return uuid.toString().replace("-", "");
}
//从请求头中提取文件名和以及文件的后缀
public static String getRealFileName(String context) {
// Content-Disposition: form-data; name="myfile"; filename="a_left.jpg"
int index = context.lastIndexOf("=");
String filename = context.substring(index + 2, context.length() - 1);
return filename;
}
//根据给定的文件名截取后缀
public static String getFileType(String fileName){
//9527s.jpg
int index = fileName.lastIndexOf(".");
return fileName.substring(index);
//8b7cb153974c4947ad6934a3213dd1f4.jpg
}
}
然后我们可以调用工具类中定义好的方法来干活了。