目录结构javascript
1、SpringMvc相关知识php
11、SpringMvc的大致认识 ?html
12、什么是MVC ? 前端
13、SpringMvc内部是怎么样工做的?java
2、环境以及第三方技术的说明git
3、咱们进入正题,下边经过一个个实例来介绍SpringMvc的用法web
3一、重要配置文件的说明ajax
3二、用户注册例子spring
3三、主页的展现shell
3四、登陆例子
3五、文件上传
3六、表单的服务器端验证
1、SpringMvc相关知识
11、SpringMvc的大致认识 ?
SpringMvc构建在Spring框架的基础上,是对Servlet进行封装(对客户端的请求以及响应进行很友好的处理),方便咱们开发Java EE程序的MVC框架。
12、什么是MVC ?
MVC全名是ModelViewController,他是一种软件设计的理念,即将数据、界面展示、业务逻辑进行分离,其好处是方便一个系统中不一样开发角色的分工,相互之间没有太大的耦合,而且各层的代码也能进行很好的重用。其中:
M是模型Model的缩写,如对数据的存取;
V是视图View的缩写,是对M层提供数据以及展示M层的数据,常见技术包括JSP、Velocity、Tiles、iText和POI ;
C是Controller的缩写,它的一个重要的职责是将V层的数据获取到后交给M,最后将M层的数据交给V层 ;
13、SpringMvc内部是怎么样工做的?
根据其工做原理,其内部工做流程以下图:
2、环境以及第三方技术的说明
当前项目是用Maven构建,其版本为apache-maven-3.0.4,开发工具为Eclipse,代码放在开源中国的Git中,当前项目的下载地址为:https://git.oschina.net/liw/Sports-SpringMvc.git ,其余环境以及技术说明以下:
第三方技术 |
版本 |
本实例中的做用 |
JDK |
1.7 |
|
Tomcat |
7 |
Web容器 |
Spring |
4.1.4.RELEASE |
Bean IOC |
SpringMvc |
4.1.4.RELEASE |
在MVC框架中处于C层,其做用为请求的处理以及处理结果的转发 |
jackson-mapper-asl |
1.9.13 |
Jackson ,一种用于Json处理的第三方技术 |
jackson-annotations |
2.5.0 |
|
jackson-core |
2.5.0 |
|
jackson-databind |
2.5.0 |
|
Jstl |
1.2 |
Jsp页面数据的展示 |
Servlet-api |
3.1-b05 |
J2EE的基础 |
hibernate-validator |
5.2.2.Final |
服务器端bean的验证技术,便可以对表单进行服务器端验证 |
Commons-fileupload |
1.2.2 |
文件上传 |
Commons-io |
2.4 |
|
Commons-lang |
3.4 |
提供字符串、对象、日期、数字等方便处理的帮助类 |
BootStrap |
3.3.5 |
用于页面展示布局等 |
Jquery |
1.11.3 |
页面数据元素的操做 |
3、咱们进入正题,下边经过一个个实例来介绍SpringMvc的用法
31、几个配置文件的说明,设计到的配置文件有:spring.xml、spring-mvc.xml、web.xml
spring.xml:
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <context:component-scan base-package="cn.com.sports.utils"></context:component-scan> </beans>
我将一些工具类放到了cn.com.sports.utils包中,并配置自动扫描这个包下的类,方面在其余类中使用
spring-mvc.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 自动扫描controller包下的全部类,若是@Controller注入为bean --> <context:component-scan base-package="cn.com.sports.controller" /> <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!-- json转换器 --> <ref bean="mappingJacksonHttpMessageConverter" /> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加先后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/views" /> <property name="suffix" value=".jsp" /> </bean> <!-- 配置多文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding"> <value>UTF-8</value> </property> <property name="maxUploadSize"> <!-- 上传文件大小限制为31M,31*1024*1024 --> <value>32505856</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean> <mvc:interceptors> <bean class="cn.com.sports.interceptor.AllInterceptor"></bean> <mvc:interceptor> <mvc:mapping path="/login/otherHandUI.html"/> <bean class="cn.com.sports.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <mvc:annotation-driven validator="validator"/> <!-- 如下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册--> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> </bean> </beans>
当前文件的配置文件有如下做用,固然你还能配置其余的,如下说明只适用于本项目
对bean到Json,以及返回Json到客户端的配置处理;
配置返回视图页面的前缀以及后缀;
配置文件上传的相关参数;
配置拦截器的相关信息;
配置使用HibernateValidator进行服务器验证 ;
web.xml :
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止spring内存溢出监听器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <servlet> <description>spring mvc servlet</description> <servlet-name>rest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-mvc.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>rest</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- 配置session超时时间,单位分钟 --> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <display-name>Sports-SpringMvc</display-name> </web-app>
对web.xml没什么多说的,只说明下当前项目中,配置的前端Servlet DispaterServlet只对后缀已.html结尾的URI进行拦截处理
3二、一我的员注册的例子
首先建立一个bean,名称为User.java ,其中包含一些用户的基本信息,其字段上的直接能够先不关注
package cn.com.sports.model; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotEmpty; public class User { private String id ; @NotEmpty(message="username不能为空") private String username ; @NotEmpty(message="密码不能为空") private String password ; @Email(message="email字段必须为Email") private String email ; private String hobby ; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public static void main(String[] args) { } }
建立一个Controller,名称为:UserController ,其中包含对用户的各类操做的Handler
package cn.com.sports.controller; import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validator; import org.apache.commons.lang3.ClassUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import cn.com.sports.model.User; import cn.com.sports.utils.DB; import cn.com.sports.utils.KeyGeneratorImpl; import cn.com.sports.utils.Utils; @Controller @RequestMapping("/user") public class UserController { @Autowired private DB db ; @Autowired Validator validator ; /** * 返回添加人员视图 * @return */ @RequestMapping("/addUserUI") public String addUI(){ return "/user/addUser"; } /** * 对添加人员进行处理 * @param user * @param modelMap * @return 服务器端定向到展现全部用户页面 */ @RequestMapping("/addUser") public String addUser(User user,ModelMap modelMap){ String url = "redirect:/user/showUsers.html" ; //服务器端验证 String error = validate(user); if(!"".equals(error.toString())){ modelMap.addAttribute("errors", "用户保存失败!<br>"+error.toString()); return "/user/addUser"; } KeyGeneratorImpl k = new KeyGeneratorImpl(); try { user.setId(k.getKey()); user.setPassword(Utils.encrypt(user.getPassword())); } catch (Exception e) { e.printStackTrace(); } if(db.getUserByUserOrEmail(user.getUsername()) == null) db.saveOrUpdateUser(user); else{ modelMap.addAttribute("user", user); modelMap.addAttribute("flag", "1"); url = "/user/addUser"; } return url; } /** * 返回全部人员页面的视图 * @param modelMap * @return */ @RequestMapping("/showUsers") public String showUsers(ModelMap modelMap){ List<User> users = db.getAllUser(); modelMap.addAttribute("users",users); return "/user/showUsers"; } /** * 经过人员ID删除人员 * @param modelMap * @param userId * @return */ @RequestMapping("/delUser/{userId}") public ModelAndView showUsers(ModelMap modelMap,@PathVariable String userId){ db.delUser(userId); return new ModelAndView("redirect:/user/showUsers.html"); } /** * 返回编辑页面视图 * @param modelMap * @param userId * @return */ @RequestMapping("/editUserUI/{userId}") public String editUserUI(ModelMap modelMap,@PathVariable String userId){ User user = db.getUserById(userId); modelMap.addAttribute("user",user); return "/user/editUser"; } /** * 对编辑人员进行处理 * @param user * @param modelMap * @return */ @RequestMapping("/editUser") public String editUserUI(User user,ModelMap modelMap){ //服务器端验证 String error = validate(user); if(!"".equals(error.toString())){ modelMap.addAttribute("errors", "修改用户失败!<br>"+error.toString()); return "/user/editUser"; } db.saveOrUpdateUser(user); modelMap.addAttribute("flag", "1"); return "/user/editUser"; } public String validate(User user){ Set<ConstraintViolation<User>> violations = validator.validate(user); StringBuffer buf = new StringBuffer(); for(ConstraintViolation<User> violation: violations) { String f = violation.getPropertyPath().toString() ; buf.append(f +":"+ violation.getMessage() +"<br>" ); } return buf.toString(); } }
UserController中的方法不少,这里咱们先只看addUI() 、 addUser() 、showUsers()这三方法
首先咱们经过标签@Controller标注当前类为一个Controller,而且用标签@RequestMapping进行标注,其值为"/user" ,说明UserController类中方法在其标签@RequestMapping值中加上"/user"
其次addUI() 、 addUser() 、showUsers()三方法的标签@RequestMapping("/addUserUI")、@RequestMapping("/addUser")、@RequestMapping("/showUsers") ,其含义是浏览器请求/user/addUserUI.php、/user/addUserHand.php 、/user/showUsers.php后分别请求到的资源
再对UserController中的类DB类进行说明,这里的Validator类能够先不看,后边在进行说明
DB:这里的DB至关于一个服务器端的临时数据库,对用户的数据以及后边的文件信息的维护
package cn.com.sports.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.stereotype.Component; import cn.com.sports.model.File; import cn.com.sports.model.User; @Component public class DB { private static Map<String,User> t_user = new HashMap<String,User>(); private static Map<String,File> t_file = new HashMap<String,File>(); public void saveOrUpdateUser(User user){ t_user.put(user.getId(), user); } public void delUser(String id){ t_user.remove(id); } public List<User> getAllUser(){ List<User> users = new ArrayList<User>(); Set<String> keys = t_user.keySet(); for(String key : keys){ users.add(t_user.get(key)); } return users ; } public User getUserById(String id){ return t_user.get(id); } public User getUserByUserOrEmail(String s){ User user = null ; List<User> users = getAllUser(); for(User u : users){ if(s.equals(u.getEmail()) || s.equals(u.getUsername())){ user = u ; break ; } } return user ; } public void saveFile(File file){ t_file.put(file.getId(), file); } public List<File> getAllFile(){ Set<String> files = t_file.keySet(); List<File> flist = new ArrayList<File>(); for(String f : files){ flist.add(t_file.get(f)); } return flist ; } }
说完了Model、Controller,下边咱们来看下前端的View
addUser.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <%@ include file="/common/taglib.jsp" %> <%@ include file="/common/common.jsp" %> <base href="<%=basePath%>"> <title>添加用户</title> </head> <body> <div class="container"> <h2 class="bg-info">添加用户</h2> <c:if test="${flag == 1 }"> <h5 class="bg-danger">添加用户失败,Username重复</h5> </c:if> <span style="color: red;"> ${errors } </span> <form action="user/addUser.html" method="post"> <div class="form-group"> <label for="exampleInputEmail1">Username</label> <input type="text" class="form-control" id="exampleInputEmail1" placeholder="Username" name="username" value="${user.username }"> </div> <div class="form-group"> <label for="exampleInputEmail1">Email</label> <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email" name="email" value="${user.email }"> </div> <div class="form-group"> <label for="exampleInputPassword1">Password</label> <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" name="password" value="${user.password }"> </div> <div class="form-group"> <label for="exampleInputEmail1">Yours Hobby</label> <input type="text" class="form-control" id="exampleInputEmail1" placeholder="hobby" name="hobby" value="${user.hobby }"> </div> <button type="submit" class="btn btn-default">Submit</button> <button type="reset" class="btn btn-default">Reset</button> </form> <br/> <a href="user/showUsers.html" >返回人员列表</a> </div> </body> </html>
用户信息呈现列表:
showUsers.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <%@ include file="/common/taglib.jsp" %> <%@ include file="/common/common.jsp" %> <title>显示全部用户信息</title> <base href="<%=basePath%>"> </head> <body> <div class="container"> <h2 class="bg-info">展现用户</h2> <table class="table table-bordered table-hover"> <thead> <tr> <th>Username</th> <th>Email</th> <th>Hobby</th> <th>ID</th> <th>Password</th> <th>操做</th> </tr> </thead> <c:forEach items="${users }" var="user"> <tr> <td> ${user.username } </td> <td>${user.email }</td> <td>${user.hobby }</td> <td>${user.id }</td> <td>${user.password }</td> <td><a href="user/delUser/${user.id }.html">删除</a>|<a href="user/editUserUI/${user.id }.html">编辑</a></td> </tr> </c:forEach> </table> <br> <a href="">返回主页</a> <a href="user/addUserUI.html">添加用户</a> </div> </body> </html>
以上就完成了一个M、V、C的过程,经过开源中国的Git地址下载个人代码,部署上项目,若是部署电脑IP为127.0.0.1,端口为8080,Sports-SpringMvc,那么经过URL http://127.0.0.1:8080/Sports-SpringMvc/user/addUserUI.html 能访问咱们的人员注册页面,效果图以下:
保存成功后,跳转到人员列表中,以下图:
3三、为了对当前项目有一个很清晰的说明,我简单作了一个主页(index.jsp),其代码和页面效果以下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <%@ include file="/common/common.jsp" %> <%@ include file="/common/taglib.jsp" %> <base href="<%=basePath %>"> <script type="text/javascript"> $(document).ready(function(){ $("#logout").click(function(){ logout(); }); function logout(){ $.ajax({ type:"POST", url:"login/logout.html", data:{}, datatype: "text",//"xml", "html", "script", "json", "jsonp", "text". beforeSend:function(){}, //成功返回以后调用的函数 success:function(data){ window.location.reload(); }, //调用执行(success方法)后调用的函数 complete: function(XMLHttpRequest, textStatus){ }, //调用出错执行的函数 error: function(){ //请求出错处理 } }); } }); </script> </head> <body> <div class="container"> <h1>SpringMvc的学习</h1> <h4>咱们经过如下几个场景来一块儿学习<c:if test="${not empty userName}">,当前学习者:${userName } </c:if></h4> 一、<a href="user/showUsers.html">人员管理</a><br> 二、<a href="login/loginUI.html">人员登陆</a><br> 三、<a href="file/fileUI.html">上传文件</a><br> 四、<a href="login/otherHandUI.html">其余资源</a><br> 五、<a href="javascript:void()" id="logout">注销</a> </div> </body> </html>
经过URL:http://127.0.0.1:8080/Sports-SpringMvc/ 访问,其效果以下
3四、对功能模块”其余资源“的说明,该模块中,只有当用户登陆事后,才能显示”其余资源“下的内容,这个模块中对过滤器进行了使用,访问http://127.0.0.1:8080/Sports-SpringMvc/,点击其余资源,就能完成如下描述的操做
相关的代码片断:
spring-mvc.xml中的过滤器的代码片断,其做用是对URL :http://127.0.0.1:8080/Sports-SpringMvc//login/otherHandUI.html的拦截,若是登陆过,在跳转到资源页面,若是未登陆则进行登陆
<mvc:interceptors> <bean class="cn.com.sports.interceptor.AllInterceptor"></bean> <mvc:interceptor> <mvc:mapping path="/login/otherHandUI.html"/> <bean class="cn.com.sports.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
cn.com.sports.interceptor.LoginInterceptor 类的代码,判断Session中是否保存了用户的一个惟一标识USERID
package cn.com.sports.interceptor; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import cn.com.sports.controller.LoginController; /** * 只拦截 /login/otherUI.html * @author Liw * */ public class LoginInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { Object o = request.getSession().getAttribute(LoginController.USERID); if(o == null){ RequestDispatcher rd = request.getRequestDispatcher("/login/loginUI.html"); rd.forward(request, response); return false ; }else{ return true; } } }
LoginController中的代码片断:其做用是返回一个Jsp页面
/** * 登陆处理 * @param user * @param modelMap * @return 根据验证结果返回不一样的视图 */ @RequestMapping("/otherHandUI") public String otherHandUI(){ return "/login/other"; }
other.jsp页面代码内容,不要太在乎该页面的内容
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <%@ include file="/common/taglib.jsp" %> <%@ include file="/common/common.jsp" %> <base href="<%=basePath%>"> <title>其余操做</title> </head> <body> <div class="container"> <h2 class="bg-info">其余操做</h2> 哈哈,你终于注册、登陆啦!<br><br> <a href="">返回主页</a> </div> </body> </html>
3五、上传文件
在浏览器中经过 http://127.0.0.1:8080/Sports-SpringMvc/ ,点击上传文件,就能完成如下描述的操做
FileController的代码以下,其做用是对文件的上传以及文件路径的保存
package cn.com.sports.controller; import java.io.File; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import cn.com.sports.utils.DB; import cn.com.sports.utils.KeyGeneratorImpl; @Controller @RequestMapping("/file") public class FileController { @Autowired public KeyGeneratorImpl keyGeneratorImpl ; @Autowired public DB db ; /** * 返回文件上传视图 * @return */ @RequestMapping("/fileUI") public String uploadUI(ModelMap modelMap){ modelMap.put("files", db.getAllFile()); return "/file/file"; } /** * 处理文件上传 * @param file * @param request * @param model * @return */ @RequestMapping("upload") public String upload(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request, ModelMap model){ String path = request.getSession().getServletContext().getRealPath("upload"); String fileName = file.getOriginalFilename(); File targetFile = new File(path, fileName); if(!targetFile.exists()){ targetFile.mkdirs(); } try { file.transferTo(targetFile); } catch (Exception e) { e.printStackTrace(); } cn.com.sports.model.File mode = new cn.com.sports.model.File(); try { mode.setId(keyGeneratorImpl.getKey()); mode.setName(fileName); mode.setUrl(request.getContextPath()+"/upload/"+fileName); db.saveFile(mode); } catch (Exception e) { e.printStackTrace(); } model.addAttribute("fileUrl", request.getContextPath()+"/upload/"+fileName); return "redirect:/file/fileUI.html"; } }
spring-mvc.xml的代码片断:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding"> <value>UTF-8</value> </property> <property name="maxUploadSize"> <!-- 上传文件大小限制为31M,31*1024*1024 --> <value>32505856</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean>
上传页面的代码以及页面展示效果:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <%@ include file="/common/taglib.jsp" %> <%@ include file="/common/common.jsp" %> <base href="<%=basePath%>"> <title>上传文件</title> <script type="text/javascript"> function check(){ if($("#exampleInputFile").val() == ""){ alert('请选择您要上传的文件,图片哟!'); return false ; }else{ return true ; } } </script> </head> <body> <div class="container"> <h2 class="bg-info">上传文件</h2> <table class="table table-bordered table-hover"> <thead> <tr> <th>ID</th> <th>name</th> <th>文件</th> </tr> </thead> <c:forEach items="${files }" var="file"> <tr> <td> ${file.id} </td> <td>${file.name}</td> <td><a href="${file.url }"><img alt="" src="${file.url }" class="img-circle" height="100px;"></a></td> </tr> </c:forEach> </table> <form action="file/upload.html" enctype="multipart/form-data" method="post" onsubmit="return check()"> <div class="form-group"> <label for="exampleInputFile">File input</label> <input type="file" id="exampleInputFile" name="file" /> <p class="help-block">Example block-level help text here.</p> </div> <button type="submit" class="btn btn-default">Submit</button> <br><br><a href="">返回主页</a> </form> </div> </body> </html>
其效果以下:
3六、表单服务器端的验证,拿用户注册进行说明:
这个项目中经过HibernateValidator对表单进行服务器端进行验证,代码片断以下:
spring-mvc.xml
<!-- 如下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册--> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> </bean>
UserController中的相关代码片断:
/** * 对添加人员进行处理 * @param user * @param modelMap * @return 服务器端定向到展现全部用户页面 */ @RequestMapping("/addUser") public String addUser(User user,ModelMap modelMap){ String url = "redirect:/user/showUsers.html" ; //服务器端验证 String error = validate(user); if(!"".equals(error.toString())){ modelMap.addAttribute("errors", "用户保存失败!<br>"+error.toString()); return "/user/addUser"; } KeyGeneratorImpl k = new KeyGeneratorImpl(); try { user.setId(k.getKey()); user.setPassword(Utils.encrypt(user.getPassword())); } catch (Exception e) { e.printStackTrace(); } if(db.getUserByUserOrEmail(user.getUsername()) == null) db.saveOrUpdateUser(user); else{ modelMap.addAttribute("user", user); modelMap.addAttribute("flag", "1"); url = "/user/addUser"; } return url; } public String validate(User user){ Set<ConstraintViolation<User>> violations = validator.validate(user); StringBuffer buf = new StringBuffer(); for(ConstraintViolation<User> violation: violations) { String f = violation.getPropertyPath().toString() ; buf.append(f +":"+ violation.getMessage() +"<br>" ); } return buf.toString(); }
添加页面的效果:
但愿以上博文对初学者有帮助,具体详细代码能够到https://git.oschina.net/liw/Sports-SpringMvc.git中下载,编写博文不免有不详细或者理解有误,若有但愿指出,并能相互学习。