响应数据和结果视图
----controller 方法返回字符串String
响应数据可以借用request或者Model对象
结果视图:
可以指定逻辑视图名,“success”通过视图解析器解析为物理视图地址。
指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
跳转方式:
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发
如果用 return "forward:/WEB-INF/pages/success.jsp";:则路径必须写成实际视图 url
使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法
return "redirect:/testReturnModelAndView"; 它相当于“response.sendRedirect(url)”。
需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不 能写在 WEB-INF 目录中,否则无法找到。
----controller 方法返回void
Servlet 原始 API 可以作为控制器中方法的参数
response.sendRedirect("testRetrunString") //注意这里没有/加了就等于根路径
response.sendRedirect("。。/testRetrunString")//这种方式是代表的上一级预防有上一级
response.sendRedirect(request.getContextPath()+"/redirect.jsp");//个人感觉这样重定向更好
----controller 方法返回ModelAndView
public ModelAndView testModelAndView() {
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("success");//逻辑视图默认请求转发
//可以实际路径都行"forward:/WEB-INF/pages/success.jsp"
"redirect:/testReturnModelAndView"
return mv;
}
SpringMVC 实现文件上传
文件上传的必要前提
A form 表单的 enctype 取值必须是: multipart/form-data
(默认值是:application/x-www-form-urlencoded)
enctype:是表单请求正文的类型
B method 属性取值必须是 Post
C 提供一个文件选择域<input type=”file” />
文件上传的原理分析
当 form 表单的 enctype 取值不是默认值后, request.getParameter()将失效。
enctype=”application/x-www-form-urlencoded”时, form 表单的正文内容是:
key=value&key=value&key=value
当 form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:
每一部分都是 MIME 类型描述的正文
-----------------------------7de1a433602ac 分界符
Content-Disposition: form-data; name="userName" 协议头
aaa 协议的正文
-----------------------------7de1a433602ac
Content-Disposition: form-data; name="file";
filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt"
Content-Type: text/plain 协议的类型(MIME 类型)
传统文件上传部分代码
public String testUpload1(HttpServletRequest request,HttpServletResponse response) throws Exception {
String realPath = request.getSession().getServletContext().getRealPath("/upload");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateTime = dateFormat.format(new Date());
File file = new File(realPath,dateTime);
if(!file.exists()) {
file.mkdirs();
}
boolean b = ServletFileUpload.isMultipartContent(request);
if(!b) {
throw new Exception("当前文件不支持上传");
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FileItem> list = fileUpload.parseRequest(request);
for (FileItem fileItem : list) {
String fileName = fileItem.getFieldName();
String uuid = UUID.randomUUID().toString();
fileName=fileName+uuid;
fileItem.write(new File(file,fileName));
fileItem.delete();
}
return "success";
}
----MVC文件上传
注意事项
1<form>表单的文件上传name属性和MultipartFile对象的名称一摸一样
MultipartFile : springMVC提供的对象
* 包含了文件上传中的所有信息
* (字节流,文件名称)
2.需要配置文件解析器
* <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--
设置最大上传的大小:
1M
-->
<property name="maxUploadSize" value="1000000"></property>
</bean>
<form action="${pageContext.request.contextPath }/MVCupload/testUpload2" method="post" enctype="multipart/form-data">
<input type="file" name="multiPartFile"/><br/>
<input type="submit" value="上传"/>
</form>
public String testUpload2(HttpServletRequest request,MultipartFile multiPartFile) throws Exception {
String realPath = request.getSession().getServletContext().getRealPath("/upload2");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateTime = dateFormat.format(new Date());
File file = new File(realPath,dateTime);
if(!file.exists()) {
file.mkdirs();
}
System.out.println("mvc上传");
String fileName = multiPartFile.getOriginalFilename();
String uuid = UUID.randomUUID().toString();
fileName=fileName+uuid;
multiPartFile.transferTo(new File(file,fileName));
return "success";
----跨服务器上传
接收文件的目标服务器可以支持写入操作
1<init-param>
<param-name>readOnly</param-name>
<param-value>false</param-value>
</init-param>
2String fileName = multiPartFile.getOriginalFilename();
3String uuid = UUID.randomUUID().toString();
4fileName=fileName+uuid;
//5.创建 sun 公司提供的 jersey 包中的 Client 对象 Client client = Client.create();
//6.指定上传文件的地址,该地址是 web 路径 WebResource resource = client.resource(FILESERVERURL+fileName);
//7.实现上传 String result = resource.put(String.class,multiPartFile.getBytes());
return "success";