java ssm框架学习——SpringMVC--1

时间:2021-11-03 23:47:38

1.  SpringMVC介绍

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

>让我们能非常简单的设计出干净的Web层和薄薄的Web层;
√进行更简洁的Web层的开发;
√天生与Spring框架集成(如IoC容器、AOP等);
√提供强大的约定大于配置的契约式编程支持;
√能简单的进行Web层的单元测试;
√支持灵活的URL到页面控制器的映射;
√非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);
√非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
√提供一套强大的JSP标签库,简化JSP开发;
√支持灵活的本地化、主题等解析;
√更加简单的异常处理;
√对静态资源的支持;
√支持Restful风格。如:http://www.csdn.com/deletefile/1

 

FreeMarker Velocity解释

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件配置文件源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅使用简单的模板语言(template language)来引用由java代码定义的对象。

 

2.  Springmvc与struts2的区别

1、           springmvc是基于方法进行拦截的,而struts2是基于进行拦截的。

Struts2每拦截一个URL就会创建一个Action实例,而springmvc每个Controller只有一个实例,每次请求执行对应的方法即可。

2、           springmvc可以单例开发,且建议单例,而struts2只能使用多例。

而struts2接收参数是通过成员变量接收参数,无法使用单例,只能使用多例。

3、           经过实际测试,struts2比springmvc的速度慢。根本原因在于使用struts标签,而不是因为单例还是多例的问题。

 

4、           Struts2有漏洞,springmvc目前还没有漏洞出现。

如果使用struts2,建议下载最新包。

 

 

 

3.  SpringMVC快速入门

3.1. 导入SpringMVC jar包

3.2. 配置web.xml中servlet控制器

<!-- 前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

 

3.3. 创建springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
 
<context:component-scan base-package="com.example.project.controller"></context:component-scan>
</bean>
 
 
--注意--创建config文件夹时,是sourefolder

 

 

3.4. 创建User类,准备showUser.jsp

3.5. 创建UserController

@Controller(value = "userController")
public class UserController {
    @RequestMapping("/user_show")
    public ModelAndView showUser() {
        ArrayList<User> userList = new ArrayList<User>();
        userList.add(new User(1, "张老三", "男", 18, new Date()));
        userList.add(new User(1, "王老五", "男", 19, new Date()));
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("userList", userList);
        modelAndView.setViewName("showUser.jsp");
        return modelAndView;
    }
}

3.6. 代码测试

4.  SpringMVC执行流程

java ssm框架学习——SpringMVC--1

5.  SpringMVC架构流程

5.1. 流程图

 java ssm框架学习——SpringMVC--1

5.2. 流程说明

流程图说明】

1.用户发送请求至 前端控制器DispatcherServlet

2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping

3.处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet

4.前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller

5.执行处理器(Controller,也叫后端控制器)

6.处理器Controller执行完后返回ModelAnView

7.处理器适配器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet

8.前端控制器DispatcherServletModelAnView传给视图解析器ViewResolver

9.视图解析器ViewResolver解析后返回具体的视图View

10.前端控制器DispatcherServlet视图View进行渲染视图(即:将模型数据填充至视图中)

11.前端控制器DispatcherServlet响应用户。

5.3. 源码分析

6.  SpringMVC 重要组件说明

6.1. DispatcherServlet:前端控制器

>用户请求到达前端控制器,它就相当于mvc模式中的c,
dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

 

6.2. HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等

 

6.3.  Handler:处理器

>Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

 

6.4. HandlAdapter:处理器适配器

>通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

 

6.5.  View Resolver:视图解析器

>View Resolver负责将处理结果生成View视图,
View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,
再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 

 

6.6. View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

6.7.  三大组件

在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开放的组件有handler、view

 

6.8. 配置三大组件

6.8.1.1.         为什么要配置?

>如果没有显示的配置处理器映射器和处理器适配那么springMvc会去默认的dispatcherServlet.properties中查找,
对应的处理器映射器和处理器适配器去使用,这样每个请求都要扫描一次他的默认配置文件,效率非常低,会降低访问速度,所以要显示的配置处理器映射器和处理器适配器

 

6.8.1.2.         注解形式的处理器映射器和处理器适配器

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

6.8.1.3.         配置最新版的注解的处理器映射器和处理器适配器

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> 

 

6.8.1.4.         持续更新的最终配置方式

<!-- 配置注解方式处理器映射器和处理器适配器 -->
<mvc:annotation-driven></mvc:annotation-driven>

6.8.1.5.         视图解析器   

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 真正的页面路径 =  前缀 + 去掉后缀名的页面名称 + 后缀 -->
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
    <!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>

7.  参数绑定

需求:使用表单上传用户信息

7.1. 方式一:使用HttpServletRequet接收请求参数

7.1.1.1.          代码

@RequestMapping("user_regist")
public String regist(HttpServletRequest request) {
        String username = request.getParameter("username");
        System.out.println(username);
        return "index.jsp";
}

7.1.1.2.         SpringMVC默认支持的参数类型

HttpServletRequest
通过request对象获取请求信息
HttpServletResponse
通过response处理响应信息
HttpSession
通过session对象得到session中存放的对象
Model/ModelMap

7.1.1.3.          请求乱码解决方案:

get请求

New String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

post请求

使用拦截器方式
<filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

最佳解决方案:

修改tomcat配置文件添加编码与工程编码一致,一致

<Connector URIEncoding="utf-8" connectionTimeout="20000" 
port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 

7.2. 方式二:使用基本数据类型直接封装方式

@RequestMapping("user_regist2")
public String regist2(String username, String sex, Integer age, Model model) {
        User user = new User(username, sex, age);
        ArrayList<User> userList = new ArrayList<>();
        userList.add(user);
        model.addAttribute("userList", userList);
        return "showUser.jsp";
}

7.3. 方式三:使用pojo方式进行参数封装

@RequestMapping("user_regist3")
public String regist3(User user, Model model) {
    ArrayList<User> userList = new ArrayList<>();
    userList.add(user);
    model.addAttribute("userList", userList);
    return "showUser.jsp";
}

7.4. 方式四:使用VO方式进行数据封装

7.4.1.1.         表中字段写法

<table align="center" cellpadding="10" border="1"
    bordercolor="#ff0000">
    <tr>
        <td>用户名:</td>
        <td><input type="text" name="user.username" id="username"></td>
    </tr>
    <tr>
        <td>性别:</td>
        <td><input type="text" name="user.sex" id="sex"></td>
    </tr>
    <tr>
        <td>年龄:</td>
        <td><input type="text" name="user.age" id="age"></td>
    </tr>
    <tr>
        <td colspan="2"><input type="submit"></td>
    </tr>
</table>

7.4.1.2.         VO类

public class UserVO {
private User user;
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}
public UserVO() {
    super();
}
}

7.4.1.3.         参数获取

@RequestMapping("user_regist4")
public String regist3(UserVO userVo, Model model) {
    ArrayList<User> userList = new ArrayList<>();
    userList.add(userVo.getUser());
    model.addAttribute("userList", userList);
    return "showUser.jsp";
}

7.5. 数组参数绑定

http://localhost:8080/Day03_SSM/deletePatch.action?ids=1&ids=2

7.5.1.1.         方式一 在方法中定义数组

@RequestMapping("/deletePatch")
public String deletePatch(Integer [] ids) {
    return "redirect:selectUser.action";
}

7.5.1.2.         方式二:使用vo方式进行接收

public class QueryVo {
private Integer[] ids;
public Integer[] getIds() {
    return ids;
}
public void setIds(Integer[] ids) {
    this.ids = ids;
}
}
@RequestMapping("/deletePatch")
public String deletePatch(QueryVo queryVo) {
    return "redirect:selectUser.action";
}

 

8.  Controller配置细节

 

8.1. 限制请求路径---在类上限制请求路径

@Controller(value = "userController")
@RequestMapping(value="/user")
public class UserController {
请求时需要拼接 /user

8.2. 限制Http请求方法

@RequestMapping(value="/showUser",method=RequestMethod.POST)

8.3. 返回值

ModelAndView 

指定视图,并且把model数据放到request域中。
addObject(key,value)
setViewName(逻辑视图名称)

Void

如果返回值为void的时候,
可以在controller方法形参上定义request和response,
使用request或response指定响应结果。
比如:转发 重定向 输出

String

普通形式如:"showUser.jsp" 代表逻辑视图的名称
默认转发 forward 如:"forward:index.jsp"
重定向 redirect 如:"redirect:index.jsp"

JSON数据交互

下一节