spring 之 springMVC 学习1

来源:互联网 发布:淘宝有什么推广方式 编辑:程序博客网 时间:2024/05/27 21:48
常见MVC框架比较
运行性能上:
Jsp+servlet>struts1>spring mvc>struts2+freemarker>>struts2,ognl,值栈。
开发效率上,基本正好相反。值得强调的是,spring mvc开发效率和struts2不相上下。

Struts2的性能低的原因是因为OGNL和值栈造成的。所以,如果你的系统并发量高,可以使用freemaker进行显示,而不是采用OGNL和值栈。这样,在性能上会有相当大得提高

1.环境搭建web.xml

[html] view plaincopy
  1. <web-app  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"   
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  5.   
  6.     <servlet>  
  7.         <servlet-name>dispatcherServlet</servlet-name>  
  8.         <servlet-class>  
  9.             org.springframework.web.servlet.DispatcherServlet  
  10.         </servlet-class>  
  11.         <init-param>   <!--  不设置此内容的话,会默认加载:<servlet-name>标签内名字+"-servlet”的xml,即dispatcherServlet-servlet.xml-->  
  12.             <param-name>contextConfigLocation</param-name>  
  13.             <param-value>/WEB-INF/web-config.xml</param-value><!-- 有多个配置文件,中间用,隔开 -->  
  14.         </init-param>  
  15.         <load-on-startup>1</load-on-startup>  
  16.     </servlet>  
  17.     <servlet-mapping>  
  18.         <servlet-name>dispatcherServlet</servlet-name>  
  19.         <url-pattern>/</url-pattern>       <!-- 所有请求都捕获 -->  
  20.     </servlet-mapping>  
  21. </web-app>  

web-config.xml:
[html] view plaincopy
  1.   
[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd  
  7.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  9.     <mvc:annotation-driven/>  
  10.     <context:component-scan base-package="com.test.controller" />  
  11.       
  12.     <mvc:resources location="/resources/" mapping="/resource/**"/><!-- 指定静态资源(请求不被spring过滤)如css,js等的位置 ,css路径应是mapping中的路径-->  
  13.       
  14.     <!-- 页面View层基本信息设定 -->  
  15.     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  16.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  <!-- 如果使用jstl的话,配置的属性 -->  
  17.         <property name="suffix" value=".jsp"/>  <!-- 后缀 -->  
  18.         <property name="prefix" value="/WEB-INF/jsp/" />       <!-- 前缀 -->   
  19.     </bean>  
  20.    
  21.  <!-- 处理文件上传 -->  
  22.     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >    
  23.         <property name="defaultEncoding" value="utf-8"/> <!-- 默认编码 (ISO-8859-1) -->    
  24.         <property name="maxInMemorySize" value="10240"/> <!-- 最大内存大小 (10240)-->    
  25.         <property name="uploadTempDir" value="/upload/"/> <!-- 上传后的目录名 (WebUtils#TEMP_DIR_CONTEXT_ATTRIBUTE) -->    
  26.         <property name="maxUploadSize" value="-1"/> <!-- 最大文件大小,-1为无限止(-1) -->    
  27.     </bean>  
  28. </beans>  



常用注解使用方法如下例子的注释:

[java] view plaincopy
  1. @Controller  
  2. @SessionAttributes({"param","se"})////获取session,将ModelMap中属性名字为param、se的再放入session中,这样,request和session中都有了。  
  3. @RequestMapping(value="user")    //--1  @RequestMapping在类前面定义,则将url和类绑定。在方法前面定义,则将url和类的方法绑定  
  4. public class HelloController {  
  5.     @RequestMapping(value={"/hello2","/hello"},params="method=do")  //--2 value指定多个值,可以多个访问路径  
  6.     public String hello() {  
  7.         return "hello";   //根据设置将跳到/WEB-INF/jsp/hello.jsp中  
  8.     }  
  9.     // 1、2处如果同时定义了路径则是两处的叠加 上面的这个访问路径:  
  10.     //http://localhost:8080/springMVC/user/hello2?method=do   http://localhost:8080/springMVC/user/hello?method=do  
  11.       
  12.     //获取传过来的值   直接用参数就可以获取  
  13.     @RequestMapping(params="param=do")  //http://localhost:8080/springMVC/user?param=do&name=ljf&age=22&id=1&uname=test  
  14.     public String serv(int id,@RequestParam String name,@RequestParam("age"int old,User u){ //@RequestParam 注解用來表示传来的参数不和形參一致解決方法  
  15.         System.out.println(u.getUname()+" "+id+" "+name+" "+old); //传过来的值会和对象属性名字自动匹配  
  16.         return "hello";  
  17.     }  
  18.     //传过来的值不能少,如果少了任一个就会出错,少id会报异常,少name,age会报404找不到路径  
  19.       
  20.       
  21.     //值返回去   用map 或者 model 它们的值就会存在request域中  
  22.     @RequestMapping  //http://localhost:8080/springMVC1/user  
  23.     public String say(Map<String, Object> map,Model model,HttpServletRequest req,HttpSession session) {//获取request,session  
  24.           
  25.         map.put("param""v1");  
  26.         model.addAttribute("p1""v2");  
  27.         //使用Object的类型作为key,String-->string  
  28.         User u=new User("ljf");  
  29.         model.addAttribute("ok");//${string}  
  30.         model.addAttribute(u); //${user.uname}  
  31.           
  32.         session.setAttribute("se""se");  
  33.         return "hello";  
  34.     }  
  35.       
  36.     @RequestMapping("/req")  
  37.     public String req(@ModelAttribute("se") String name) { //@ModelAttribute 把session中的"se"賦給name,注意,如果session中没有,将报错  
  38.         System.out.println(name);  
  39.         return "hello";   
  40.     }  
  41.       
  42.     //ModelAndView模型视图类  
  43.         //从名字上可以知道ModelAndView中的Model代表模型,View代表视图。即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性  
  44.         @RequestMapping(params="method=reg6")  
  45.         public ModelAndView reg6(String uname)  
  46.         {  
  47.             ModelAndView mv = new ModelAndView();  
  48.             mv.setViewName("hello");  
  49. //          mv.setView(new RedirectView("index"));  
  50.               
  51.             User u = new User("abc");  
  52.             mv.addObject(u);   //查看源代码,得知,直接放入对象。属性名为”首字母小写的类名”。 一般建议手动增加属性名称。  
  53.             mv.addObject("a""aaaa");  
  54.             return mv;  
  55.         }  
  56. }  

和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此,我们将控制器设计成无状态类。(和struts2不一样,因为函数的参数是唯一的)

核心原理
1.用户发送请求给服务器。url:user.do
2.服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。
3.DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。
4.Controller开始执行。
5.Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。
6.DispatchServlet将执视图对象中的数据,输出给服务器。
7.服务器将数据输出给客户端。

spring 转发,重定向

[java] view plaincopy
  1.   
[java] view plaincopy
  1. @RequestMapping(value="/add",method=RequestMethod.POST)  
  2.     public String add(@Valid User user,BindingResult bind){  
  3.         if(bind.hasErrors())  
  4.             return "user/add";  
  5.         users.put(user.getUsername(),user);  
  6.         return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";//"forward:user.do"; 默認转发//重定向return "redirect:user.do";    
  7.     }  
spring采用rest形式访问资源,以资源为导向

[java] view plaincopy
  1. @RequestMapping(value="/{username}/update",method=RequestMethod.GET)//**************加{}  
  2.     public String update(@PathVariable String username,Model model){//@PathVariable 路径变量username即为路径中的内容:{}中内容  
  3.         model.addAttribute(users.get(username));  
  4.         return "user/update";  
  5.     }  

下面是一个用户管理的基本功能:

user类:

[java] view plaincopy
  1. public class User {  
  2.     private String username;  
  3.     private String password;  
  4.     private String email;  
  5.       
  6.     public User() {  
  7.         super();  
  8.     }  
  9.     public User(String username, String password, String email) {  
  10.         super();  
  11.         this.username = username;  
  12.         this.password = password;  
  13.         this.setEmail(email);  
  14.     }  
  15.     @NotEmpty(message="用户名不能为空")  
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.     public void setUsername(String username) {  
  20.         this.username = username;  
  21.     }  
  22.       
  23.     @NotEmpty(message="密码不能为空")   
  24.     @Size(max=10,min=4)  
  25.     public String getPassword() {    
  26.         return password;  
  27.     }  
  28.     public void setPassword(String password) {  
  29.         this.password = password;  
  30.     }  
  31.     @NotEmpty(message="邮箱不能为空")  
  32.     @Email(message="邮箱格式不正确")  
  33.     public String getEmail() {  
  34.         return email;  
  35.     }  
  36.     public void setEmail(String email) {  
  37.         this.email = email;  
  38.     }  
  39.   
  40. }  
处理user异常的类:

[java] view plaincopy
  1. public class UserException extends RuntimeException{  
  2.     public UserException() {  
  3.         super();  
  4.     }  
  5.     public UserException(String message, Throwable cause) {  
  6.         super(message, cause);  
  7.     }  
  8.     public UserException(String message) {  
  9.         super(message);  
  10.     }  
  11.     public UserException(Throwable cause) {  
  12.         super(cause);  
  13.     }  
  14. }  
controller类:

[java] view plaincopy
  1. @Controller  
  2. @RequestMapping("/user")  
  3. public class UserController {  
  4.     private final static Map<String,User> users=new HashMap<String, User>();  
  5.     public UserController(){  
  6.         users.put("ldh",new User("ldh""123""123123"));  
  7.         users.put("zxy",new User("zxy""123""123123"));  
  8.         users.put("gfc",new User("gfc""123""123123"));  
  9.         users.put("lm",new User("lm""123""123123"));  
  10.     }  
  11.       
  12.     @RequestMapping(value={"users","/"})  
  13.     public String list(Model model){  
  14.         model.addAttribute("users", users);  
  15.         return "user/list";  
  16.     }  
  17.       
  18.     @RequestMapping(value="/add",method=RequestMethod.GET) //method 属性要求请求方式必须是get   
  19.     public String add(Model model){  
  20.         model.addAttribute(new User());// 这步不能少,如果是new User("a","b","c"),则表单里显示user内容   
  21.         return "user/add";  
  22.     }  
  23.       
  24.     /*验证字段:springMVC使用 JSR-303 Validator(java标准)验证, 可以查看 JSR 303 - Bean Validation文档, 需要bean-validator.jar 
  25.         然后在实体类中采用注解形式标明验证条件 ,在调用方法中使用@Valid指明验证的model,以及用BindingResult存储错误信息,在页面中用spring form表单显示错误 
  26.     */  
  27.     @RequestMapping(value="/add",method=RequestMethod.POST)  
  28.     public String add(@Valid User user,BindingResult bind){  
  29.         if(bind.hasErrors())  
  30.             return "user/add";  
  31.         users.put(user.getUsername(),user);  
  32.         return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";//"forward:user.do"; 默認转发//重定向return "redirect:user.do";    
  33.     }  
  34.       
  35.       
  36.     @RequestMapping(value="{username}",method=RequestMethod.GET)   
  37.     public String show(@PathVariable String username,Model model){   
  38.         model.addAttribute(users.get(username));  
  39.         return "user/show";  
  40.     }   
  41.       
  42.     /**spring采用rest形式访问资源,以资源为导向**/  
  43.     @RequestMapping(value="/{username}/update",method=RequestMethod.GET)//**************加{}  
  44.     public String update(@PathVariable String username,Model model){//@PathVariable 路径变量username即为路径中的内容:{}中内容  
  45.         model.addAttribute(users.get(username));  
  46.         return "user/update";  
  47.     }  
  48.     @RequestMapping(value="/{username}/update",method=RequestMethod.POST)  
  49.     public String update(@PathVariable String username,@Valid User user,BindingResult bind){//bind一定要紧跟在User之后  
  50.         if(bind.hasErrors())  
  51.             return "user/update";  
  52.         users.put(username, user);  
  53.         return "redirect:/user/users";  
  54.     }  
  55.       
  56.     @RequestMapping("ex")  
  57.     public String ex(){ //测试处理异常  
  58.         if(true)  
  59.             throw new UserException("用户出现错误 !");  
  60.         return "user/users";  
  61.     }  
  62.       
  63.     //异常处理   
  64.     @ExceptionHandler(value={Exception.class})  //此处是Exception.class,所以可以处理所有的异常  
  65.     public String handlerException(Exception ex,HttpServletRequest req){  
  66.         req.setAttribute("ex", ex);  
  67.         return "user/error"//转发到error.jsp,${error.message}输出错误信息  
  68.           
  69.     }  
  70. }  

add.jsp:

[html] view plaincopy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <title>title</title>  <link rel="stylesheet" href="/springMVC2/resource/css/main.css" type="text/css"/> <!-- 此处是mapping位置 -->  
  7. </head>  
  8. <body>  
  9.     <sf:form method="post" modelAttribute="user" >  
  10.     username:<sf:input path="username"/> <sf:errors path="username"/><br>  
  11.     password:<sf:password path="password"/><sf:errors path="password"/><br>  
  12.     email:<sf:input path="email"/><sf:errors path="email"/><br>  
  13.     <input type="submit" value="提交" />;  
  14.     </sf:form>  
  15. </body>  
  16. </html>  


文件上传:用到commons-fileupload.jar,commons-io.jar

[java] view plaincopy
  1. @RequestMapping(value="/upload", method = RequestMethod.POST)//要求form表单以post方式上传  
  2.     public String handleUploadData(String name,@RequestParam("file") CommonsMultipartFile file){//多文件 多文件MultipartFile[] file用for处理  
  3.         if (!file.isEmpty()) {  
  4.                String path = this.servletContext.getRealPath("/tmp/");  //应放在指定的静态资源文件中<mvc:resource />,获取本地存储路径 存储在了D:\study\apache-tomcat-6.0.35\webapps\test\tmp  
  5.                System.out.println(path);  
  6.                String fileName = file.getOriginalFilename();//获取文件名  
  7.                String fileType = fileName.substring(fileName.lastIndexOf("."));  
  8.                System.out.println(fileType);   
  9.                File file2 = new File(path,new Date().getTime() + fileType); //新建一个文件  
  10.                try {  
  11.                     file.getFileItem().write(file2); //将上传的文件写入新建的文件中  
  12.                } catch (Exception e) {  
  13.                     e.printStackTrace();  
  14.                }  
  15.                return "redirect:upload_ok.jsp";  
  16.             }else{  
  17.                 return "redirect:upload_error.jsp";  
  18.             }  
0 0
原创粉丝点击