SpringMVC学习笔记(二)
来源:互联网 发布:淘宝上好看的女装店 编辑:程序博客网 时间:2024/05/21 20:49
SpringMVC学习笔记(二)
综合示例,文件上传,自定义拦截器,json交互
个人笔记,如有错误,恳请批评指正。
综合示例(springmvc文件上传)
multipartResolver使用
spring-mvc.xml文件添加如下内容:
<!--文件上传使用, 配置multipartResolver,id名为约定好的 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 配置文件(每次上传的所有文件总大小)大小,单位为b, 1024000表示1000kb --> <property name="maxUploadSize" value="1024000" /> </bean>
中文乱码处理
web.xml文件添加如下内容:
<filter> <filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param></filter><filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
如果上边的方式设置后,仍然有乱码,请尝试修改tomcat安装目录下的apache-tomcat安装目录\conf\server.xml文件,修改Connector元素内容,添加URIEncoding="UTF-8"
,修改后内容 如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
properties文件信息注入
PropertiesFactoryBean:用来注入properties类型的配置文件信息
<!--PropertiesFactoryBean对properties文件可用 ,可以用来注入properties配置文件的信息 --><bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:xxxxx.properties"></property></bean>
文件上传示例
导入包
继续使用上一章节代码,并导入文件上传需要的jar包:commons-fileupload-1.2.2.jar, commons-io-2.0.1.jar
修改student实体类,添加文件类型属性
public class Student implements Serializable { private static final long serialVersionUID = -5304386891883937131L; private Integer stuId; private String stuName; private String stuPwd; private Integer stuAge; private MultipartFile[] files; ......}
编写上传页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <form action="student/save.action" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="stuName"><br/> 密码<input type="password" name="stuPwd"><br> 请选择文件:<br/><input type="file" name="files"><br/> <input type="file" name="files"><br/> <input type="submit" value="文件上传测试"> </form> </body></html>
编写控制器
StudentAction.java
@Controller@RequestMapping("/student")public class StudentAction { public StudentAction(){ System.out.println("---StudentAction构造方法被调用---"); } @RequestMapping("/save") public String save(Student student) { System.out.println("save方法已注入student对象:"+student); MultipartFile[] files=student.getFiles(); for(MultipartFile file:files){ if(file.isEmpty()){ System.out.println("文件为空"); }else{ System.out.println("文件不为空!"); System.out.println("格式:" + file.getContentType()); System.out.println("原名:" + file.getOriginalFilename()); System.out.println("大小:" + file.getSize()); System.out.println("表单控件的名称" + file.getName()); try { FileUtils.copyInputStreamToFile(file.getInputStream(), new File("e:/testupload/"+file.getOriginalFilename())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println("---调用业务逻辑进行业务处理---"); //直接使用字符串,返回视图,进行结果展现等 return "forward:/jsp/main.jsp"; }}
修改配置文件
添加文件处理器CommonsMultipartResolver配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd "> <mvc:annotation-driven></mvc:annotation-driven> <context:component-scan base-package="*"/> <!--文件上传使用, 配置multipartResolver,id名称为约定好的 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 配置文件(每次上传的所有文件总大小)大小,单位为b, 1024000表示1000kb --> <property name="maxUploadSize" value="1024000" /> </bean></beans>
编写处理完后跳转的页面
main.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><html> <head> <title>main.jsp</title> </head> <body> /jsp/main.jsp页面 student: ${requestScope.student} </body></html>
文件存放于tomcat目录下处理方式
在项目目录下新建upload文件夹
修改StudentAction.java。
@Controller@RequestMapping("/student")public class StudentAction { public StudentAction(){ System.out.println("---StudentAction构造方法被调用---"); } @Resource ServletContext application; @RequestMapping("/save") public String save(Student student) { System.out.println("save方法已注入student对象:"+student); MultipartFile[] files=student.getFiles(); System.out.println("真实路径:"+application.getRealPath("/")); for(MultipartFile file:files){ if(file.isEmpty()){ System.out.println("文件为空"); }else{ System.out.println("文件不为空!"); System.out.println("格式:" + file.getContentType()); System.out.println("原名:" + file.getOriginalFilename()); System.out.println("大小:" + file.getSize()); System.out.println("表单控件的名称" + file.getName()); try { FileUtils.copyInputStreamToFile(file.getInputStream(), new File(application.getRealPath("/")+"upload/"+file.getOriginalFilename())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println("---调用业务逻辑进行业务处理---"); //直接使用字符串,返回视图,进行结果展现等 return "forward:/jsp/main.jsp"; }}
其它代码同上一章节,可以在application.getRealPath(“/”)+”upload/”目录下查看到文件。
文件上传优化
编写文件上传工具类
FileUploadUtil.java
@Component(value="fileUploadUtils") //普通的bean注入public class FileUploadUtils { /* * 注入字符串,#{}为spel语言,其中uploadProperties,是xml配置文件中注入properties文件的bean id, * path为properties文件的其中一个key ,也可以通过下边的set方法注入 */ @Value("#{uploadProperties.path}") private String path; //private String path="e:/testupload"; //path也可以通过set方法注入// @Value("#{uploadProperties.path}") // public void setPath(String path) {// this.path = path;// } private String getExtName(MultipartFile file){ return FilenameUtils.getExtension(file.getOriginalFilename()); } private String createNewName(MultipartFile file){ return UUID.randomUUID().toString()+"."+getExtName(file); } public String uploadFile(MultipartFile file){ try { String newName=createNewName(file); FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path,newName )); return newName; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(e); } }}
修改StudentAction.java
主要修改save方法,使用自已的文件上传工具类进行文件上传。
@Controller@RequestMapping(value="/student")public class StudentAction { @Resource private ServletContext application; @Resource private FileUploadUtils fileUploadUtils; public StudentAction(){ System.out.println("---StudentAction构造方法被调用---"); } @RequestMapping(value="/save") public String save(Student student,Map<String, Student> paramMap) { System.out.println("save方法已注入student对象:"+student); MultipartFile[] files=student.getFiles(); for(MultipartFile file:files){ if(file.isEmpty()){ System.out.println("文件为空"); }else{ System.out.println("文件不为空!"); fileUploadUtils.uploadFile(file); } } System.out.println("---调用业务逻辑进行业务处理---"); paramMap.put("student",student); //直接使用字符串,返回视图,进行结果展现等 return "forward:/jsp/main.jsp"; }}
添加upload.properties文件
配置文件上传后的存放目录
path=e\:\\testdir\\upload\\
修改spring-mvc.xml配置文件
注入配置文件的信息
<!--PropertiesFactoryBean对properties文件可用 ,可以用来注入properties配置文件的信息 --><bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:upload.properties"></property></bean>
综合示例(登陆)
拦截器使用
编写拦截器类
LoginInterceptor.java,需要实现HandlerInterceptor接口
public class LoginInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub System.out.println("---访问请求资源后不管理有没有异常都一定执行此方法---"); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub System.out.println("---访问请求资源后,如果没有异常,将执行此方法---"); } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("---访问请求资源前执行,如果此方法返回false,将不能访问请求资源---"); return true; }}
配置文件中添加拦截器
<!-- 配置spring mvc拦截器 --><mvc:interceptors><!-- 默认拦截DispatcherServlet指定的后缀(这里是.action) --> <bean class="cn.itcast.interceptor.LoginInterceptor"/></mvc:interceptors>
登陆示例
编写及配置拦截器
添加拦截器类及拦截器配置信息,如上面。
修改拦截器类preHandle方法
@Overridepublic boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("---访问请求资源前执行,如果此方法返回false,将不能访问请求资源---"); if(arg0.getSession().getAttribute("user")==null){ arg1.sendRedirect(arg0.getContextPath()+"/login.jsp"); return false; } return true;}
编写登陆页面
login.jsp,本页面已模仿了登陆
<%@page import="cn.itcast.entity.Student"%><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <% session.setAttribute("user", new Student(1001,"zcf","admin",20)); %> <!-- 这里正常应该跳到action再到页面 ,为了演示,这里简略--> <a href="index.jsp">已登陆,返回首页</a> </body></html>
json交互
使用上面的源码,暂时去掉拦截器的登陆权限处理
导入json包及jquery的js文件
修改action文件
@Controller@RequestMapping(value="/student")public class StudentAction { public StudentAction(){ System.out.println("---StudentAction构造方法被调用---"); } @RequestMapping("/doAjax") @ResponseBody //如果返回json格式,需要这个注解 public Object doAjax(Student student){ System.out.println("---doAjax.student:"+student); student.setStuName("1001name"); return student; }}
修改访问页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML><html><head><% pageContext.setAttribute("basePath", request.getContextPath() + "/");%><title></title></head><script type="text/javascript" src="${basePath }js/jquery/jquery-1.3.js"></script><script type="text/javascript"> $(function() { $("#login").click(function() { $.ajax({ url : "student/doAjax.action", type : "post", dataType : "json", data : { "stuName" : "sss", "stuPwd" : "sss" }, success : function(ajax) { alert(ajax.stuName + ajax.stuPwd); } }); }); }); $(function(){ $("#bt1").click( function(){ $.post( "student/doAjax.action", {stuName:"name1001",stuPwd:"pwd1001"}, function(json){alert(json.stuName+"||"+json.stuPwd);}, "json" ); } ); } );</script><body> <button id="login">testajax</button> <button id="bt1">testajax</button></body></html>
阅读全文
0 0
- SpringMvc学习笔记(二)SpringMvc控制器
- SpringMVC学习笔记(二)
- SpringMVC学习笔记(二)
- SpringMVC学习笔记(二)
- SpringMVC学习笔记(二)
- SpringMVC学习笔记二
- springMVC学习笔记二(dispatcherServlet)
- 入门Demo---SpringMVC学习笔记(二)
- 入门Demo---SpringMVC学习笔记(二)
- SpringMVC学习笔记(二)-----配置文件
- J2EE系列之SpringMVC学习笔记(二)--SpringMVC控制器
- SpringMvc学习笔记(二)- SpringMvc的执行流程
- springMVC笔记(二)
- SpringMVC笔记(二)
- Springmvc笔记(二)
- SpringMVC学习(二)
- springmvc 学习(二)
- SpringMvc学习(二)
- vue使用遇到问题汇总
- flex 中通过httpservice 向后台请求的3中方式
- MYSQL学习第二天---数据类型等
- JAVA CAS原理深入分析
- SpringMVC学习笔记(一)
- SpringMVC学习笔记(二)
- JavaScript中的数据类型转换
- 多重背包--二进制优化
- SpringMVC学习笔记(三)
- scanf函数使用大全
- java并发编程学习(2)
- 关于使用VS实现MFC串口通信
- 支持向量机通俗导论(理解SVM的三层境界)
- Activity启动模式及Intent 常用Flag