易强xi

SpringMVC详细学习笔记

Spring MVC

 

1 spring MVC简介:

 

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。

 

2 SpringMVCstruts2的区别

1、springmvc基于方法开发的,struts2基于类开发的。springmvc将url和controller里的方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似web service开发。
2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。
3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。



 

 

 

3 使用 spring MVC

   1 导入jar包

   2 在web.xml中配置核心控制器(前端控制器) DispatcherServlet

      <servlet>

   <servlet-name>springmvc</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

   <!-- 执行springmvc 的前端控制器,并加载springmvc 的配置文件 -->

   <init-param>

     <param-name>contextConfigLocation</param-name>

     <param-value>classpath:spring-mvc.xml</param-value>

   </init-param>

 </servlet>

 <servlet-mapping>

   <servlet-name>springmvc</servlet-name>

   <url-pattern>*.do</url-pattern>

 </servlet-mapping>

 

 

 

 3 配置spring MVC的配置文件

     文件名任意,通常情况下,文件名为 核心控制器配置时

 

<beans xmlns="http://www.springframework.org/schema/beans"

    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.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd">

 

    启动spring的注解

 

<context:annotation-config/>

 

    启动bean扫描

 

<context:component-scan base-package="com.hxzy.controller"/>

 

<!-- 使用spring 的视图解析器 跳转页面使用 -->

  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

     <property name="prefix" value="/"></property><!-- 跳转路径的前缀 -->

     <property name="suffix" value=".jsp"></property><!-- 能运行的页面的后缀是能是jsp的 -->

  </bean>

</beans>

 

3 Controller(控制器)

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

 

@Controller //表示当前的类,是控制层的内容

@RequestMapping("helloContr") //需要执行的模块的名称,类名称,千万别重复

public class HelloController {

 

  @RequestMapping("/hello")

  public String helloDingDing(Model model){

     /**

      * Model model 模型类,可以使用这个类,添加属性,

      * 用于传递到页面上的数据

      */

     model.addAttribute("message", "您好,今天凉快");

     return "/helloWord";//跳转后,需要执行的jsp页面的名字

  }

}

   1 @Controller  表示这个类是控制层

2  @RequestMapping配置Controller的访问路径

 

   加在类上,也要加在方法上

 

    例如:

@RequestMapping(value="RegisterController.do")

public class RegisterController{

  

   这个controller的访问路径为 RegisterController.do

 

   3 controller中的方法:

      返回值类型 任意

      方法名     任意

      参数列表   任意

 

      建议: 返回String类型---- 用来做跳转路径

      方法要想被访问,必须在方法也添加@RequestMapping

 

      @RequestMapping

     public String register(){

    

     return "index.jsp";

     }

 

    

  4 关于@RequestMapping

          1 加在类上       @RequestMapping(value="RegisterController.do")

           配置controller的访问路径

 

          2 加在方法上  @RequestMapping

             使得方法可以被访问

 

 

          3 加在方法上 @RequestMapping 一些其他属性的配置

@RequestMapping(method=RequestMethod.GET)

             表示这个方法只有 是GET请求时才能访问

 

 

        

 

 

 

 

 

          4 一个controller中有多个方法时,如何区分访问

 

 @RequestMapping(method=RequestMethod.GET,params="method=aaa")

          这个方法的访问路径为:

           HelloWorldController.do?method=aaa

 

 

         5 不在class上配置@RequestMapping,只在 方法上配置                                @RequestMapping

 

    访问路径就是   项目名/helloworld/test.do 

  @RequestMapping(value="/helloworld/test")

   

   5 controller中 获取客户端提交的数据的方式:

 

       1 方法中定义 HttpServletRequest类型的参数

        public String register(HttpServletRequest request){

    

           String name = request.getParameter(“name”);

 

         return "index.jsp";

      }

 

@RequestParam("name")

 

       2 在方法参数中使用 @RequestParam 注解

 public String register(@RequestParam("name") String name,@RequestParam("age") int age){

    

          System.out.println(name);

          System.out.println(age);

 

  @RequestParam("name") 中的 "name" 要和请求参数的key值相同

         return "index.jsp";

      }

注意:当请求参数和 方法参数同名时,@RequestParam注解可以省略

 

          3 使用 @PathVariable 注解 --这种用法比较特殊,少用

 

@RequestMapping(value="/hello/{name}/{age}")

  public String hello(@PathVariable("name") String name,@PathVariable("age") int age){

 

     //省略了 class 上的@RequestMapping

     // 访问这个方法??? hello/zhangsan/100.do

      

     System.out.println(name+"\t"+age);

    

     return "/helloworld.jsp";

  }

 

 

 

 

  6 controller 方法中 在作用域中设置值带回给客户端

   

      1 通过 request.setAttribute();

 

      2 通过方法的参数 ModelMap model

       public String register(ModelMap modelMap){

 

             modelMap.put(“key”,Object); --放在request作用域

       }

 

 7 controller中使用Session

 

         1 通过request 获取session   request.getSession()

 

         2 使用 @SessionAttributes

               

                @SessionAttributes 的使用方式:

 

                  必须加在class上

@SessionAttributes({"user","name",.....})                  @RequestMapping(value="RegisterController.do")

public class RegisterController{

 

                 public String register(ModelMap modelMap){

 

             modelMap.put("user",user); --放在request作用域

             modelMap.put("name","王帅");

       }

   }

 

    modelMap中存的值 将会在session中也保存一份

 

 

    

  8 关于跳转

 

              1 返回字符串  默认是转发方式

              2 重定向  return “redirect:index.jsp”

 

              3 跳转路径 前缀后缀的设置

<!-- 配置视图 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 

        p:prefix="/WEB-INF/view/" p:suffix=".jsp"> 

        <property name="viewClass">            

            <value>org.springframework.web.servlet.view.JstlView</value>             

        </property> 

    </bean> 

      -->

 

        return “index” 将会跳转到 /WEB-INF/view/index.jsp  

 

 9 关于使用ModelAndView

 

   通常用于方法的返回值

 

public ModelAndView test2(){

 

    String name = “王帅”;

    return new ModelAndView(new Redirect(“index.jsp”));

   

 

      return new ModelAndView(new Redirect(“index.jsp”),”name”,name); -- 另一种带值得方式

 

    return new ModelAndView(new RedirectViews(“index.jsp”),map); --map 为Map 也是用来带值

 

 

}

 

 

public ModelAndView test2(){

 

       ModelAndView mav = new ModelAndView();

 

       mav.setViewName(viewName); //设置跳转路径

       mav.addObject(obj) // 这种设置方式,带的值 key为这个对象所属类的 类名首字母小写

       mav.addObject(“key”,obj)

 

       return mav;

 

}

 

10 @ModelAttribute注解

      作用一:获取请求参数:

 

 

                    public String register(@ModelAttribute User user,@RequestParam("birthday111") String birthday)

 

客户端提交的数据会直接封装 user中,要保证请求参数的key和user的属性相同

 

还会将user存入request作用域

对于Date的birthday无法完成直接的赋值,因此单独进行配置

 

     

       另一个作用:加在方法上,方法将会在controller中要调用的方法之前执行

 

@ModelAttribute("myList")

public List<User> getList(){  //这个方法将在 register方法之前执行

   System.out.println("getList......");

  

   User u1 = new User(1,"aaa",20,new Date());

   User u2 = new User(2,"bbb",30,new Date());

   User u3 = new User(3,"ccc",40,new Date());

  

   List<User> list = new ArrayList<User>();

   list.add(u1);

   list.add(u2);

   list.add(u3);

  

exceptionHandler(Exception e){

    

     System.out.println(e.getMessage());

    

     return "exception.jsp";

}

 

 

 

 5 spring MVC 文件上传

commons-fileUpload.jar

commons-io.jars

 

   <!-- 配置文件上传 --> 

   <bean id="multipartResolver"      

          class="org.springframework.web.multipart.commons.CommonsMultipartResolver"      

          p:defaultEncoding="utf-8">

   </bean>

单个文件上传

   

    @RequestMapping

    public String upload(HttpServletRequest request) throws

    Exception{

   

    MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;

   

    MultipartFile mf = req.getFile("myFile");

   

    System.out.println(mf.getName());

    System.out.println(mf.getOriginalFilename());

    System.out.println(mf.getSize());

   

    InputStream is = mf.getInputStream();

   

    String folderPath =

    request.getSession().getServletContext().getRealPath("/upload"); 

    OutputStream os = new

    FileOutputStream(folderPath+"/"+mf.getOriginalFilename());

   

    int len=0; byte[] b = new byte[1024];

   

    while((len=is.read(b))>0){

   

    os.write(b, 0, len); }

   

    is.close();

      os.close();

   

  return "success.jsp";

 }

 

多文件上传:

 

   public String upload(HttpServletRequest request,ModelMap model) throws Exception{

        

     MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;

        

     List<MultipartFile> list  = req.getFiles("myFile");

    

     String folderPath = request.getSession().getServletContext().getRealPath("/upload");

    

     for(MultipartFile mf:list){

      

       if(!mf.isEmpty()){

      

       OutputStream os = new FileOutputStream(folderPath+"/"+mf.getOriginalFilename());

      

       InputStream is = mf.getInputStream();

      

       byte[] b = new byte[1024];

      

       int len = 0;

      

       while((len=is.read(b))>0){

        

         os.write(b, 0, len);

       }

      

       is.close();

       os.close();

      

      

       System.out.println(mf.getName());

       System.out.println(mf.getOriginalFilename());

       }

     }

    

     return "success.jsp";

  }

 

 

验证:

 

<bean id="multipartResolver"      

          class="org.springframework.web.multipart.commons.CommonsMultipartResolver"      

          p:defaultEncoding="utf-8">

       <property name="maxUploadSize">

        <value>200000000000</value>

       </property>      

   </bean> 

         

     <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException --> 

    <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 --> 

    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 

        <property name="exceptionMappings"> 

            <props> 

                <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --> 

                <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload.jsp</prop> 

            </props> 

        </property> 

</bean>

 

 

 

  6 spring MVC拦截器

 

自定义拦截器的两种方式:

 

  1 实现HandlerInterceptor

 

public class MyInterceptor implements HandlerInterceptor {

 

  @Override

  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,

       Object arg2) throws Exception {

     //Object arg2 指的是下一个拦截器对象

    

     System.out.println("Controller之前执行...");

    

     return true;

  }

 

  @Override

  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,

       Object arg2, ModelAndView arg3) throws Exception {

     System.out.println("controller之后,生成视图之前执行");

    

  }

 

  @Override

  public void afterCompletion(HttpServletRequest arg0,

       HttpServletResponse arg1, Object arg2, Exception arg3)

       throws Exception {

    

     System.out.println("最后执行,一般用来释放资源");

    

  }

 

}

 

2 继承 HandlerInterceptorAdapter

 

可以指定覆盖哪个方法

 

 

 

拦截器定义完成后,需要在配置文件中声明

 

<mvc:interceptors> 

    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 --> 

         <bean class="web.interceptor.MyInterceptor"/> 

        <mvc:interceptor> 

             <mvc:mapping path="/RegisterController.do"/> 

                <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --> 

                <bean class="web.interceptor.MyInterceptor2"/> 

         </mvc:interceptor> 

 </mvc:interceptors>

 

 

 

 7 spring MVC 返回JSON数据

 

   Controller 返回json格式数据:

 

     1 导入jar包

     jackson-core-asl.jar

     jackson-mapper-asl.jar

 

 

     2 修改spring MVC 配置文件

<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射    -->

   <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

       <property name="messageConverters">

            <list>

                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

                    <property name="supportedMediaTypes">

                        <list>

                            <value>text/html; charset=UTF-8</value>

                            <value>application/json;charset=UTF-8</value>

                        </list>

                    </property>

                </bean>

            </list>

        </property>

</bean>

 

 3 controller中:

@RequestMapping

  public @ResponseBody List<User> test(String name){

     System.out.println(name+"-------------");

    

     User u1 = new User("aaa","123",20);

     User u2 = new User("bbb","345",21);

     User u3 = new User("ccc","234",22);

    

     List<User> list = new ArrayList<User>();

    

     list.add(u1);list.add(u2);list.add(u3);

    

     return list;

}

posted on 2017-10-27 18:02  易强xi  阅读(283)  评论(0编辑  收藏  举报

导航