SpringMVC实现上传下载、实现自定义视图解析器、实现拦截器

1. 原生Servlet实现上传下载

1.1 导入jar包

上传下载jar包

1.2 请求格式要求

  1. 设定form表单的method属性值为post
  2. 设定form表单的enctype属性值为multipart/form-data

1.3 UploadServlet实现

@WebServlet("/upload")
public class UploadServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp){
		//解析请求中的二进制数据
			//创建FileItemFactory对象
			FileItemFactory factory=new DiskFileItemFactory();
			//创建解析对象
			ServletFileUpload upload=new ServletFileUpload(factory);
		//设置上传资源大小限制(以字节为单位)
			//单个文件大小
			upload.setFileSizeMax(1024*1024);
			//请求资源总大小
			upload.setSizeMax(1024*1024*10);
		//设置请求头字符编码集
		upload.setHeaderEncoding("utf-8");
		//解析
		List<FileItem> items=null;
		try{
			items=upload.parseRequerst(req);
		}catch(FileUploadException e){
			e.printStackTrace();
			resp.getWriter().write("文件超出大小限制!");
			return;
		}
		//处理请求
			//存储上传资源
			String oldName="";
			String newName="";
			String type="";
			String desc="";
			String suffix="";
			String path="";
			for(FileItem item:items){
				//判断是否为文件对象
				if(!item.isFormFiled()){
					//获取文件类型
					type=item.getContentType();
					//获取文件原名
					oldName=item.getName();
					//获取文件后缀名
					suffix=oldName.substring(oldName.lastIndexOf("."));
					//校验文件类型
					if(!(".png").equals(suffix)){
						resp.getWriter().write("文件类型不正确!");
						return;
					}
					//创建文件存储名
					newName=""+UUID.randomUUID()+System.currentTimeMillis()+suffix;
					//创建文件存储路径
					path=this.getServletContext().getRealPath("/uploadfiles");
					try{
						item.write(new File(path,newName));	
					}catch(Exception e){
						e.printStackTrace();
					}
				}else{
					if("desc".equals(item.getFiledName())){
						desc=item.toString("utf-8");
					}	
				}
			}
		//记录上传文件信息
			//获取当前用户ID
			int uid=((User)req.getSession().getAttribute("user")).getUid();
			Upload u=new Upload(uid,newName,oldName,type,desc);
			//业务层处理
			UploadService service=new UploadServiceImpl();
			int i=service.upload(u);
			if(i>0){
				resp.getWriter().write("上传成功");
			}else{
				resp.getWriter().write("上传失败");	
			}
	}
}

1.4 DownloadServlet实现

@WebServlet("/download")
public class DownloadServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp){
		//获取请求信息
		String filename=req.getParameter("filename");
		String filetype=req.getParameter("filetype");
		//设定响应文件类型
		resp.setContentTpye(filetype);
		//设定响应另存为
		resp.setHeader("Content-Disposition","attachment;filename="+filename);
		//处理请求
			//获取下载文件的路径
			String path=this.getServletContext().getRealPath("/uploadfile/"+filename);
			//获取下载文件的读取流对象
			FileInputStream fis=new FileInputStram(path);
			//获取输出流对象
			ServletOutputStream sos=resp.getOutputStream();
			//响应结果
			IOUtils.copy(fis,sos);
			//关闭流资源
			fis.close();
			sos.close();
	}
}

2. SpringMVC实现上传下载

2.1 导入jar包

包括SSM整合jar包及上传下载的jar包

2.2 请求格式要求

请求格式与原生一致

2.3 SpringMVC配置文件处理上传文件大小

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	//请求数据最大值
	<property name="maxInMemorySize" value="10485760"/>
	//单个文件最大值
	<property name="maxUploadSize" value="1048576"/>
	//请求头字符集
	<property name="defaultEncoding" value="utf-8"/>
</bean>
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="exceptionMappings">
		<props>
			<prop key="org.springframework.web.multipart.MaxUploadSizeException">limit.jsp</prop>
		</props>
	</property>
</bean>

2.4 文件上传的单元方法

@Controller
public class MyController{
	@RequestMapping("upload")
	public String upload(String uname,MultipartFile file,HttpServletRequest req){
		//获取文件原始名
		String oldName=file.getOriginalFilename();
		//获取文件后缀名
		String suffix=oldName.substring(oldName.lastIndexOf("."));
		//判断文件类型
		if(!(".png".equals(suffix))){
			return "redirect:/error.jsp";
		}
		//创建文件新名
		String newName=""+UUID.randomUUID()+System.currentTimeMills()+suffix;
		//创建文件存储路径
		String path=req.getServletContext().getRealPath("/uploadfiles");
		//存储
		file.transferTo(new File(path,newName));
		return "redirect:/success.jsp";
	}
}

2.5 文件下载的单元方法

@Controller
public class MyController{
	@RequestMapping("download")
	public String download(String newName,String type,HttpServletRequest req,HttpServletResponse resp){
		//设定响应类型
		resp.setContentType(type);
		//设定响应头
		resp.setHeader("Content-Disposition","attachment;filename="+newName);
		//获取文件下载的路径
		String path=req.getServletContext.getRealPath("/uploadfiles/"+newName);
		//创建输入流对象
		InputStream is=new FileInputStream(new File(path));
		//创建输出流对象
		ServletOutputStream sos=resp.getOutputStream();
		//结果响应
		IOUtils.copy(is,sos);
		//关闭流资源
		is.close();
		sos.close();
	}
}

3. SpringMVC自定义视图解析器

3.1 作用

简化WEB-INF下资源访问

3.2 实现

  1. 在SpringMVC的配置文件中配置视图解析器bean,并注入前缀和后缀
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/WEB-INF/"/>
    	<property name="suffix" value=".jsp"/>
    </bean>
    
  2. 在单元方法中直接返回该资源的名字即可(return “/WEB-INF/view.jsp”; —> reutrn “view”;)
  3. 如果有同名问题,则不能省略forward关键字
    //请求转发WEB-INF下view.jsp
    return "view";
    //请求转发web下view.jsp
    return "forward:/view.jsp";
    //请求转发一个别名为view的单元方法
    return "forward:view";
    
  4. 请求转发WEB-INF下多个资源可只声明一个单元方法,但需要该方法使用restful风格来实现
    @RequestMapping("{uri}")
    public String getJsp(@PathVariable("uri") String uri){
    	return uri;
    }
    
  5. WEB-INF下的静态资源可配置配置静态资源放行时的location属性值前添加“/WEB-INF”值
    <mvc:resources mapping="/js/**" location="/js/">
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
    

4. SpringMVC拦截器

4.1 作用

根据需求,拦截指定的请求

4.2 实现

  1. 创建一个实现了拦截器接口的普通类
public class MyInterceptor implements HandlerInterceptor{
	@Resource
	private MyController myController;
	
	@Override
	public boolean preHandle(HttpServletRequest req,HttpServletResponse resp,Object o) throws Exception{
		//获取当前请求的单元方法的方法对象
		Method method=((HandlerMethod)o).getMethod();
		//执行单元方法
		String invoke=(String)method.invoke(myController,null);//返回请求转发的字符串(返回的是所请求的单元方法的return "xx"中的xx)
		req.getRequestDispatcher(invoke).forward(req,resp);
		//放行
		return true;
	}
	
	@Override
	public void postHandle(HtteServletRequest req,HttpServletResponse resp,Object o,ModeAndView modelAndView) throws Exception{
		//获取所请求单元方法的返回值
		String returnString=modelAndView.getViewName();
		//获取Model存储的数据
		String str=(String)modelAndView.getModel().get("str");
		//替换敏感词
		if(str.contains("敏感词")){
			str=str.replace("敏感词","**");
		}
		modelAndView.getModel().put("str",str);
		//修改view的路径,实现资源保护
		modelAndView.setViewName("busy.jsp");
	}

	@Override
	public void afterCompletion(HttpServletRequest req,HttpServletResponse resp,Object o,Exception e) throws Exception{
		//捕获异常
		if(null != null){
			resp.getWriter().write("server is busy.");
		}
	}
}
  1. 在SpringMVC的配置文件中配置拦截范围及拦截器bean
<mvc:interceptors>
	//配置拦截MyInterceptor类中所有单元方法
	<bean id="my2" class="cn.khue.interceptor.MyInterceptor"/>

	//配置拦截MyInterceptor类中指定单元方法
	<mvc:interceptor>
		<mvc:mapping path="/test"/>
		<bean id="my" class="cn.khue.interceptor.MyInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值