DEMO结构:
1.导入Spring3.1 MVC所依赖的jar(具体根据项目来)
2.在web.xml中配置DispatcherServlet
<!-- 中文过滤器 --> <filter> <filter-name>CharacterFilter</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>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>demo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demo</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
3.新建demo-servlet.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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="com.controller"/> <!--扫描到@Controller注解的Bean --> <mvc:annotation-driven/> <!-- 静态文件处理 /resources/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置 --> <mvc:resources mapping="/resources/**" location="/resources/" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 文件上传处理 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>1024</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean> <!-- 全局异常处理 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="com.exception.UserException">error</prop> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error</prop> </props> </property> </bean> </beans>
package com.controller; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import com.bean.User; import com.exception.UserException; @Controller @RequestMapping("/user") //要访问这个controller都要在前面加上/user public class UserController { private static Map<String,User> map = new HashMap<String,User>(); public UserController() { map.put("u1", new User("u1","p1","[email protected]")); map.put("u2", new User("u2","p1","[email protected]")); map.put("u3", new User("u3","p1","[email protected]")); map.put("u4", new User("u4","p1","[email protected]")); map.put("u5", new User("u5","p1","[email protected]")); } @RequestMapping(value="/users",method=RequestMethod.GET) public String list(Model model){ //Model 用于传递值 model.addAttribute("users", map); return "user/users"; } @RequestMapping(value="/add",method=RequestMethod.GET) public String add(@ModelAttribute("user")User user){ return "user/useradd"; } @RequestMapping(value="/add",method=RequestMethod.POST) public String add(@Validated User user,BindingResult result,@RequestParam("files")MultipartFile[] files,HttpServletRequest req) throws IOException{//BindingResult必须紧跟@Validated if(result.hasErrors()){ System.out.println("error"); return "user/useradd"; } for (MultipartFile multipartFile : files) { if(multipartFile.isEmpty()){ continue; } System.out.println(multipartFile.getName()+","+multipartFile.getOriginalFilename()+","+multipartFile.getContentType()+","+multipartFile.getSize()); String path = req.getSession().getServletContext().getRealPath("/resources");//获取resources在工程下的路径 File f = new File(path+"\\"+multipartFile.getOriginalFilename()); System.out.println(path+"\\"+multipartFile.getOriginalFilename()); FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), f); } map.put(user.getUsername(), user); System.out.println("no error"); return "redirect:/user/users"; //客户端跳转 } @RequestMapping(value="/{username}/show",method=RequestMethod.GET)//将URL中的占位符绑定到操作方法的入参中 public String show(@PathVariable String username,Model model){ model.addAttribute(map.get(username)); return "user/show"; } @RequestMapping(value="/{username}/update",method=RequestMethod.GET) public String update(@PathVariable String username,Model model){ model.addAttribute(map.get(username)); return "user/update"; } @RequestMapping(value="/{name}/update",method=RequestMethod.POST) public String update(@PathVariable String name,@Validated User user,BindingResult br){ if(br.hasErrors()){ return "user/update"; } map.put(name, user); return "redirect:/user/users"; } @RequestMapping(value="/{name}/delete",method=RequestMethod.GET) public String delete(@PathVariable String name){ map.remove(name); return "redirect:/user/users"; } @RequestMapping(value="/login") public String login(String username,String password,HttpServletRequest req,Model model){ if(!map.containsKey(username)){ throw new UserException("用户名不正确!"); } User user = map.get(username); if(!user.getPassword().equals(password)){ throw new UserException("密码不正确!"); } HttpSession session = req.getSession(); session.setAttribute("u", user); model.addAttribute("users", map); return "user/users"; } //返回JSON数据 @RequestMapping(value="/{username}/show",method=RequestMethod.GET,params="json") @ResponseBody //在SpringMVC中可以在Controller的某个方法上加@ResponseBody注解,表示该方法的返回结果直接写入HTTP response body中。 public User show(@PathVariable String username) { return map.get(username); } }
5.返回Map集合<users.jsp>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- 引入jstl标签用于遍历--> <body> <h1>当前用户-->${u.username }</h1> <c:forEach var="um" items="${users}"> <a href="${um.value.username}/show">${um.value.username}</a>---- ${um.value.password }---- ${um.value.email }----<a href="${um.value.username}/update">修改</a> <a href="${um.value.username}/delete">删除</a> <br/> </c:forEach> <a href="add">添加</a> </body>6.返回JSON数据
结果将会解析到body
7.表单提交、文件上传、服务器表单验证
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> <!-- 引入spring标签--> <body> <sf:form method="post" modelAttribute="user" enctype="multipart/form-data"> <ul style="list-style: none;"> <li>用户名:<sf:input path="username"/><sf:errors path="username"/></li> <li>密码:<sf:password path="password"/><sf:errors path="password"/></li> <li>Email:<sf:input path="email"/><sf:errors path="email"/></li> <li>文件:<input type="file" name="files"/></li> <li>文件:<input type="file" name="files"/></li> <li>文件:<input type="file" name="files"/></li> <li><input type="submit" value="添加"/></li> </ul> </sf:form> </body>
新建UserException
package com.exception; public class UserException extends RuntimeException { private static final long serialVersionUID = 1L; public UserException() { super(); // TODO Auto-generated constructor stub } public UserException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } public UserException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } public UserException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } }
<body> <h1>${exception.message}</h1> </body>附:Demo下载