夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
SpringMVC

SpringMVC基础

创建一个Maven的Web项目

  • 创建一个Maven工程时,packaging 选择war
  • 在webapps下增加一个文件夹WEB-INF,并且在此文件夹下增加web.xml文件
  • 使用maven导入依赖:jsp-api、servlet-api、jstl

简介

  • SpringMVC是目前为止使用最广泛的MVC框架
  • 在Spring3.0后,已经完全超越了struts2
  • 采用了非侵入式设计
  • 支持REST风格

创建一个SpringMVC工程

  • 创建一个Maven工程
  • 使用Maven导入依赖:spring-context、spring-web、spring-webmvc

SpringMVC结构

  • 两种控制器
    • 前端控制器
      • DispatcherServlet
      • 是由SpringMVC提供
      • 前端控制器只有一个,而且只定义一次
    • 后端控制器
      • @controller
      • 后端控制器可以有多个
  • 配置
    • 在Web.xml中配置前端控制器
    • 在项目启动时,添加前端控制器(DispatcherServlet)
    • 将Spring配置(applicationContext.xml)放到一个xml中,以参数形式配置给前端控制器
    • 在前端控制器被加载的同时,Spring的xml文件也一并加载了

 

SpringMVC映射与数据模型

SpringMVC映射地址的配置方式

需要使用SpringMVC提供的注解

  • @RequestMapping(value=”拦截的路径”)
    • @RequestMapping常用的属性:
      • value
      • method
      • params
      • headers
      • produces
    • 如果只有value属性,则可以省略value不写

SpringMVC入参

  • 拦截请求
    • post:@RequestMapping(value=”/hello”,method=RequestMethod.POST)
    • get:@RequestMapping(value=”/hello”,method=RequestMethod.GET)
  • params属性
    • 过滤请求参数:当提交请求时,可以根据指定的过滤条件,来过滤请求
    • 常用方式:
      • param:请求中必须包含指定的参数
      • !param:请求中不能包含指定的参数
      • param!=value:请求中包含param参数,但其值不能是value
      • param=value:请求中包含param参数,但其值必须是value
    • 示例:@RequestMapping(value=”/submit”,method=RequestMethod.POST,params={“!username”,”password!=123″})
  • headers属性
    • 过滤请求头
    • 不常用,通常情况下限制请求头相对来说较少
    • 示例:@RequestMapping(value=”/submit”,headers=”text/html”)

Spring请求Ant风格

  • ?:匹配文件名中的一个字符
  • *:匹配文件名中的任意字符
  • **:匹配多层路径
  • 示例:@RequestMapping(value=”/submit/**/hello??”)

请求参数的映射

  • 名称匹配
    • 请求中的参数名称,与后端控制器参数的名称一致即可
  • 动态匹配
    • 在请求参数中设置变量,然后由后端控制器中的参数进行接收
    • 通过@Pathvariable(“id”)将请求路径中的id绑定到参数变量id中
    • 示例:
@ReqeustMapping(value="/myparam/{id}")
public void setParameter(@Pathvariable("id") Integer id){
    System.out.println("各户端请求值:"+id);
}

request

@RequsetMapping(value="/req")
public void setParameter(HttpServletReqeust request){
    System.out.println("账户:"+request.getParameter("name"));
    System.out.println("密码:"+request.getParameter("pwd"));
}
  • 可以在处理函数中指定HttpServletRequest参数,SpringMVC会将封装好的HttpServletRequest对象传入到参数中
  • 除了HttpServletRequest之外,还能绑定:
    • HttpServletRequest
    • HttpServletResponse
    • HttpSession
    • InputStream
    • OutputStream
    • Reader
    • Writer

VO类型

  • 提交表单参数时,可以使用VO类型来进行接收
  • 不需要使用传统的方式(request.getParameter(“参数名”))来接收
  • 注意:表单标签的name属性名,必须与VO类型中的属性名相同,否则无法注入
@ReqeustMapping(value="/submit",method=RequestMethod.POST)
public String SubMitMVC(User user){
    system.out.println(user);
    return "success"
}
//User类中的属性名称必须与表单中的标签name一致

SpringMVC原理

Spring中的数据模型

ModelAndView

  • 控制器处理方法返回值如果为ModelAndView,则其中既包含视图信息,也包含了模型数据信息
  • 提供的常用方法分为两个
    • 模型
      • ModelAndView addObject(String attributeKey,Object attributeValue)
      • ModelAndView addAllObject(Map<String,Object> modelMap)
    • 视图
      • void setView(View view)
      • void setViewName(String viewName)
@RequestMapping(value="/getPerson",method=ReqeustMethod.GET)
public ModelAndView getPerson(){
    ModelAndView mv = new ModelAndView();
    Person person = new Person(1,"张三",20,"男");
    mv.addObject("person",person);
    mv.setViewName("show");
    return mv;
}

Model

  • SpringMVC提供简化版的数据模型
  • Model中只存储模型数据
  • 它由SpringMVC创建的,只需接收并存储数据
  • 以返回字符串的形式转向到视图解析器
  • 视图解析器去除Model数据进行渲染
@RequestMapping(value="/getPerson",method=ReqeustMethod.GET)
public String getPerson(Model model){
    Person person = new Person(1,"张三",20,"男");
    modeal.addAttribute("person",person);
    return "show";//"show"是指show.jsp,即引号中的内容应为转发到的jsp文件的名称
}

Map

  • StringMVC提供集合版本的数据模型
  • 可以将数据以键/值对象的形式及逆行存储(以Map数据结构体现的Model)
  • 注意:如果数据是VO,那么键的名称必须是以小写字母开头的VO类名
//以map形式
@RequestMapping(value="/getPerson",method=ReqeustMethod.GET)
public String getPerson(Map<String,Object> map){
    Person person = new Person(1,"张三",20,"男");
    map.put("person",person);
    return "show";
}

将数据存储到Session中

  • 使用注解@SessionAttribute(names=”person”,types=Person.class)
  • 将数据模型中的数据,存储到session域中
  • 注意:此Annotation是作用在类上的,而不是方法上的
@controller
@SessionAttribute(names="person",types=Person.class)
public class HelloAction{}

 

SpringMVC整合MyBatis

  • 导包
    • servlet-api
    • jsp-api
    • jstl
    • spring-context
    • spring-web
    • spirng-webmvc
    • mybatis
    • mybatis-spring
    • commons-dbcp2
    • mysql-connector
    • spring-jdbc
    • junit
  • 配置web.xml
    • 在web.xml文件配置前端控制时,需要同时加载Spring配置文件
    • 通过servlet初始化参数形式,加载Spring配置文件
<servlet>
	<servlet-name>example</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:application*.xml</param-value>
    </init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
  • 配置Spring文件
    • Spring自动扫描
    • 配置视图解析器
    • 配置dbcp2数据源
    • 配式SqlSession工厂
    • MyBatis自动扫描
    • 配置事务管理器
    • 开启事务扫描
  • 各层代码
    • dao
    • mapper
    • service
    • action

 

访问WEB-INF下的资源

@RequestMapping("/{path}")
public String getPath(@PathVariable("path") String path){
    return path;
}
  • 通过@pathvariable实现访问WEB-INF下的资源页面

 

@ModelAttribute

  • 在控制器定义的方法使用@ModelAttribute注解,在请求之前会调用这个注解,然后调用拦截方法
  • 在此方法中可以先给数据模型存储数据,调用请求方法时,会获得@ModelAttribute方法中返回的数据值,并将请求参数重新填充到数据模型中
  • 支持两种操作方式
    • VO数据模型
    @ModelAttribute
    public MyNewTable MyNewTableModel(@RequestParam("id") Integer id){
        MyNewTable mnt = new MyNewTable();
        if(if!=null){
            mnt = service.queryId(id);
        }
        return mnt;
    }
    
    • Map数据模型
    @ModelAttribute
    public void mntModel(Map<String,Object> map,@ReqeustParam("id") Integer id){
        if(id!=null){
          map.put("myNewTable",service.queryId(id));
        }
    }
    

     

 

视图解析器

  • view
    • 视图,负责展示模型数据
    • 它具体的实现
      • jsp
      • pdf
      • Freemaker
      • excel
      • xml
    • 核心方法
      • getContextType:获取视图类型
      • render:将模型中的数据渲染到指定的视图中
  • ViewResolver
    • 视图解析器
    • 用来生成具体的视图并进行渲染
      • resolveViewName
        • 用来根据视图名称来渲染

 

SpringMVC操作JSON

  • 导入依赖
    • jackson-databind
  • 定义方法,使用@responseBody进行注解
  • 此方法返回一java对象即可。SpringMVC会自动将其转换成JSON格式字符串
@RequestMapping(value="/json",produces="application/json;charset=UTF-8")
@ResponseBody
public MyNewTable getJSON(Integer id){
    MyNewTable mnt = new MyNewTable(id);
    return mnt;
}
/*其他格式
*@RequestMapping(value="/plain",produces="text/plain;charset=UTF-8")
*@RequestMapping(value="/html",produces="text/html;charset=UTF-8")
*/

 

SpringMVC中转发和重定向

  • 在SpringMVC框架中默认的方式是转发
  • 通过返回值的字符串前缀可以手动指定类型
    • redirect(重定向)
    • forword(转发)
  • 无论是转发还是重定向都可以使用路径
    • :
      • 代表当前工程的跟路径
    • :/
      • 代表当前请求路径

 

使用静态资源

  • 可以直接使用mvc:resource标记进行映射
<mvc:resources location="/WEB-INF/html/" mapping="/html/**"></mvc:resources>

 

上传文件与回显

  • 文件上传的三种形式
    • 原生态
    • 组件
      • 开源
      • Fileupload
      • Smartupload
    • 框架集成
  • 实现上传文件的步骤
    • 导入依赖
      • commons-fileupload
      • commons-io
    • 配置CommonsMultipartResolver
      • SpringMVC提供了上传的功能,功能类就是CommonsMultipartResolver
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defalutEncoding" value="UTF-8"></property>
        <!--单位:b-->
        <property name="maxUploadSize" value="1000000"></property>
    </bean>
    
    • 定义html页面
    <!-- 上传文件的表单必须要有 enctype="multipart/form-data" -->
    <form action="upload" method="post" enctype="multipart/form-data">
    	图片名称:<input type="text" name="imgName" /><br/>
        选择图片:<input type="file" name="imgFile" /><br/>
        <input type="submit" value="提交" />
    </form>
    
    • 定义Controller
      • MultipartFile
        • 文件上传的接收对象
        • 这个文件封装了上传文件的所有信息
    @Controller
    public class UploadAction{
        @ReqeustMapping("/upload")
        public String  upload(HttpSession session,String imgName,MultipartFile imgFile){
            //获取文件类别
            System.out.println(imgFile.getContentType());
            //获取文件大小
            System.out.println(imgFile.getSize());
            //获取文件名及扩展名
            System.out.println(imgFile.getOriginalFilename());
            //获取文件名称
            System.out.println(imgFile.getName());
            
            //获取相对路径
            String path = session.getServletContext().getRealPath("/image");
            
            try{
            	//将文件写入指定位置
            	imgFile.transferTo(new File(path + imgFile.getOriginalFilename()));
            } catch (IllegalStateException | IOException e){
                e.printStackTrace();
            }
            return "success";
        }
    }
    
    • 回显映射
      • 在Spring配置文件中添加回显映射
      • 在回显时,所有访问路径都可以访问图片地址文件
    <mvc:resources location="/image/*" mapping="/**"></mvc:resources>
    

 

SpringMVC拦截器与数据映射

  • SpringMVC拦截器
    • Interceptor
    • 实现对每一个请求处理前后进行相关的业务处理
    • 类似于servlet中的filter
  • SpringMVC拦截器实现
    • HandlerInterceptor
      • 下面的方法
        • preHandle
          • 预处理回调方法
          • 若方法返回true,请求继续,调用下一个拦截器或处理器方法
          • 若方法返回false,请求处理流程中断,不会继续调用其他的拦截器或预处理器方法,此时需要response产生响应
        • postHandle
          • 后处理回调方法,实现处理器的后处理(但是在渲染之前)
          • 此时可以通过modelAndView对模型数据进行处理或视图及逆行处理
        • afterCompletion
          • 整个请求处理完毕后的回调方法,即在视图渲染完毕时调用
        • 注意:HandlerInterceptor有三个方法需要实现,但大部分时候可能只需要其中的一个方法
  • 日期类型的处理
    • 通过@DateTimeFormat注解
    • 可以将表单中的字符串根据指定的格式映射成如下的格式
      • java.util.Date
      • long
      • Calendar
    @DateTimeFormat(pattern="yyyy-mm-dd")
    private Date date;
    
  • 数组的映射
    • SpringMVC支持映射数组
      • 不支持List<User>,但可以使用另外方式间接实现
  • SpringMVC字符集过滤:在web.xml中的配置
    <!-- characterEncodingFilter字符编码过滤器 -->
      <filter>
      <filter-name>characterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
        <!--要使用的字符集,一般我们使用UTF-8-->
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
        <!--是否强制设置request的编码为encoding,默认false,不建议更改-->
        <param-name>forceRequestEncoding</param-name>
        <param-value>false</param-value>
      </init-param>
      <init-param>
        <!--是否强制设置response的编码为encoding,建议设置为true,下面有关于这个参数的解释-->
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
      <filter-name>characterEncodingFilter</filter-name>
      <!--这里不能留空或者直接写 ' / ' ,否者不起作用-->
      <url-pattern>/*</url-pattern>
      </filter-mapping>
    

     

SpringMVC分页

  • PageHelper,第三方提供
  • PageHelp分页插件操作步骤
    • 导入依赖
      • 注意:导入的时候不能使用较高版本,否则会出现加载错误
    • 将PageHelper配置到MyBatis中:在applicationContext.xml中
    <!-- SqlSession工厂中配置 -->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="plugins">
            <array>
            	<bean class="com.github.pagehelper.PageHelper">
                	<property name="properties">
                        <value>
                        	dialect=mysql <!--指定数据库类型-->
                            reasonable=true <!--false不展示第一页和最后一页-->
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    
    • 使用分页功能
    @RequestMapping("/list/{start}")
    //public String MyNewTableList(@RequstParam(value="start",required=false,defaultValue="1") Integer start)
    public String MyNewTableList(@RequstParam(value="start",required=false) Integer start){
        //第一个参数是第几页,第二个参数是每页显示几条数据
        PageHelper.startPage(start,5);
        
        List<MyNewTable> list = service.queryAll();
        //将数据库返回的查询数据装在到PageInfo中,用来实现分页效果
        PageInfo<MyNewTable> pageInfo = new PageInfo<MyNewTAble>(list);
        
        map.put("pageInfo",pageInfo);
        return "showList";
    }
    

 

SpringMVC核心原理

SpringMVC核心原理图

SpringMVC流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器
  3. 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器
  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  11. DispatcherServlet响应给用户

组件说明

  • 以下组件通常由框架提供实现
    • DispatcherSevlert
      • 前端控制器。整个流程控制中心,控制其他组件的执行,统一调度
      • 降低组件与组件之间的耦合性
      • 提高每个组件的扩展性
    • HandlerMapping(需扩展)
      • 通过处理器映射器实现不同的映射方式
      • 配置方式
        • 配置文件
        • 接口
        • 注解
    • HandlerAdapter(需扩展)
      • 处理器适配器
      • 负责执行目标Handler
    • ViewResolver(需扩展)
      • 视图解析器
      • 负责视图的解析
      • 种类
        • jsp
        • freemaker
        • pdf
        • excel
        • xml
  • 组件
    • 前端控制器DispatcherServlet(不需要开发,由框架提供)
    • 处理器映射器HandlerMapping(不需要开发,由框架提供)
    • 处理器适配器HandlerAdapter(不需要开发,由框架提供)
    • 处理器Handler(需要开发)
    • 视图解析器ViewResolver(不需要开发,由框架提供)
    • 视图View(需要开发,jsp)

 

暂无评论

发送评论 编辑评论


				
上一篇
下一篇