欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-02 21:43:22
...

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数据交互

下一节