目录
SpringMVC
前言:SSM
框架快告一段落了,感觉SSM
被誉为Java
这种极度符合软件工程开发思想和OOP
的入门框架果然有他的一套。“高内聚,低耦合”这六个字表现的淋漓尽致了真的是。
希望Java
越来越好,希望大家越学越好。
SSM-Spring
篇:SSM框架中项目核心层:Spring
SSM-MaBtis
篇:SSM框架中项目持久层:MyBatis
Maven
篇:Java项目管理神器:Maven
SpringMVC概述
Spring web MVC
框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web
应用程序的组件。MVC
模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI
逻辑)的分离,同时提供了在这些元素之间的松散耦合。
- 模型封装了应用程序数据,并且通常它们由
POJO
组成。 - 视图主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的
HTML
输出。 - 控制器主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。
SpringMVC
底层也是Servlet
。以Servlet
为核心, 接收请求,处理请求。显示处理结果给用户。
DispatcherServlet
DispatcherServlet
是框架一个Servlet
对象。负责接收请求,响应处理结果。
DispatcherServlet
作用:
- 在
init()
中创建容器对象,WebApplicationContext
,即Controller
对象 - 是一个
servlet
,能够接收请求
默认servlet配置文件位置
自定义配置文件位置:放在resource
路径下,名称直接写servlet-name
内容即可
<!-- web.xml -->
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!-- 声明springmvc的核心对象 -->
<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>
<!-- 把一些请求交给指定的servlet处理
使用中央调用器(DispatcherServlet)
1. 使用扩展名方式,格式*.xxx
2. 使用斜杠 "/"
-->
<url-pattern>/mymvc</url-pattern>
</servlet-mapping>
</web-app>
此处补充一个选项
<!--表示服务器tomcat创建对象的顺序,是 个整数值,大于等于0.
数值越小,创建对象的时间越早。-->
<servlet>
<!--
...
-->
<load-on-startup>1</load-on-startup>
</servlet>
此处放一个模板,后续解释
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @Controller
* 创建控制器对象,控制器:后端控制器,自定义类,处理请求
* 位置:在类的上面,表示创建此类的对象,对象在springmvc的容器中
*/
@Controller
public class MyController {
/**
* 方法的形参,表示请求中的参数
* 方法的返回值,表示本次请求的处理结果
* @return
*/
/**
* @RequestMapping 请求映射
* 属性:value 请求的url地址,唯一值,以"/"开头
* 位置:1.在方法上面(必须) 2.在类定义的上面(可选)
* 作用:把指定的请求交给指定的方法处理,等同于url-pattern
*/
@RequestMapping(value = {"/some.do", "/first.do"})
public ModelAndView doSome() {
// 使用这个方法处理请求,能处理请求的方法叫做控制器方法
// 调用service对象处理请求
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "处理了请求"); // 此处的msg是jsp文件中的内容
mv.addObject("fun", "执行了请求");
// 指定视图,视图的完整路径
mv.setViewName("/show.jsp");
/**
* 当框架调用完doSome()方法后,得到返回中ModelLAndview.
* 框架会在后续的处理逻辑值, 处fmv对象里面的数据和视图。
* 对数据执行request. setAttribute( "msg", ”处理I some . do请求"); 把数据放入到request作用域。
* 对视图执i行forward转发操作。 等同于request. getReques tDispather( "/show. jsp"). forward(.. )
*/
// 返回结果
return mv;
}
}
SpringMVC请求处理过程
简单处理过程:
- 用户发起请求
Tomcat
接收了请求。Tomcat
根据<url-pattern/>
标签把请求交给了其上的<servlet-name/>
中央调度器DispatcherServlet
根据请求进行分配- 查看该中央调度器的
.xml
文件,寻找控制器,查找注解RequestMapping
- 返回
ModelAndView
对象
视图解析器
<!-- controller.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: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 https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 声明组件扫描器 -->
<context:component-scan base-package="com.bjpowernode.controller"/>
<!-- 声明视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:指定视图文件的路径 -->
<property name="prefix" value="/xxx/"/>
<!-- 后缀:视图文件的扩展名 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>>
在Controller
中,使用文件名作为视图名使用,叫做视图逻辑名称
mv.setViewName("show");
使用Controller处理不同的请求
@RequestMapping(value = {"/some.do", "/first.do"})
SpringMVC的MVC组件
M
:后端控制器,返回数据model
V
:视图,view
C
:前端控制器(中央调度器),front controller
SpringMVC注解式开发
@RequestMapping
请求映射
- 属性:
value
请求的url
地址,唯一值,以"/"
开头 - 位置:
- 在方法上面(必须)
- 在类定义的上面(可选,对于公用的字符串使用)
- 作用:把指定的请求交给指定的方法处理,等同于
url-pattern
对请求提交方式的定义
对于@RequestMapping
,其有一个属性 method
,用于对被注解方法所处理请求的提交方式进行限制,即只有满足该method
属性指定的提交方式的请求,才会执行该被注解方法。
Method
属性的取值为RequestMethod
枚举常量。常用的为RequestMethod.GET
与RequestMethod.POST
,分别表示提交方式的匹配规则为GET
与POST
提交。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@RequestMapping(value = "/some.do", method = RequestMethod.POST)
以上处理器方法只能处理POST
方式提交的请求。客户端浏览器常用的请求方式,及其提交方式有以下几种:
序号 | 请求方式 | 提交方式 |
---|---|---|
1 | 表单请求 | 默认GET,可以指定POST |
2 | AJAX请求 | 默认GET,可以指定POST |
3 | 地址栏请求 | GET请求 |
4 | 超链接请求 | GET请求 |
5 | src资源路径请求 | GET请求 |
web开发中配置文件的说明
-
web.xml
部署描述符文件,给服务器(tomcat
)。作用:服务器在启动的时候,读取
web.xml
,根据文件中的声明创建各种对象,根据文件中的声明知道请求和servlet
等对象的关系。 -
框架的配置文件,
springmvc
的配置文件作用:声明框架创建的项目中的各种对象,主要是创建
Controller
对象的。
服务器开启流程
tomcat
服务器启动, 读取web.xml
,根据web.xml
文件中的说明,创建对象。springmvc
框架,new ClassPathXmlApplicationContext()
读取springmvc
的配置文件。- 用户发起请求……
处理器方法的参数
处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。
HttpServletRequest
HtpServletResponse
HttpSession
- 请求中所携带的请求参数
接收请求中的参数:逐个接收,对象接收
逐个接收
概念:请求中的参数名和控制器方法的形参名一样,按照名称对象接收参数
<form...>
<input type="text" name="name"/>
<input type="text" name="age"/>
</form...>
@RequestMapping(value = "/some.do", method = RequestMethod.POST)
public ModelAndView doSome(String name, Integer age) {
//
}
参数接收
-
框架使用
request
对象,接收参数String name = request.getParameter("name"); String age = request.getParameter("age");
-
在中央调度器的内部调用
doProperParam
方法时,按名称传递参数doProperParam(name, Integer.valueOf(age));
框架可以实现请求参数
String
到Integer
,Long
,Float等类型的转化
。
当请求中参数名和接收参数名不一致时,可以使用@RequestParam
注解
作用:解决名称不一样的问题
属性
value
:请求中的参数名称
required
:boolean
类型的,默认是true
true
:请求中必须有此参数,没有报错。false
:请求中不必有此参数,没有报错。
位置:在形参定义的前面
public ModelAndView doSome(@RequestParam(value="name")String rname,
@RequestParam(value="age")Integer rage) {
//
}
对象接收
对象接收:在控制器方法的形参是java
对象,使用java
对象的属性接收请求中参数值。
要求: java
对象的属性名和请求中参数名一样。
public ModelAndView doSome(Student student) {
ModelAndView mv = new ModelAndView();
mv.addObject("myname", student.getName());
mv.setViewName("show");
return mv;
}
处理器方法的返回值
处理器方法也可以返回Object
对象。这个Object
可以是Integer
,String
,自定义对象,Map
, List
等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody
注解,将转换后的JSON
数据放入到响应体中。
ModelAndView数据和视图
请求的结果有数据和视图,使用ModelAndView
最方便
- 数据:存放
request
作用域。 - 视图:执行
forward
转发操作。
String视图
框架的返回值是String
,执行的是forward
操作。
逻辑名称(配合配置文件.xml
,视图解析器)
/**原
public ModelAndView doSome(Student student) {
ModelAndView mv = new ModelAndView();
mv.addObject("myname", student.getName());
mv.setViewName("show");
return mv;
}
*/
public String doSome(Student student) {
return "show";
}
完整视图路径,项目中不能配置视图解析器
public String doSome(Student student) {
return "/WEB-INF/view/show.jsp";
}
void
没有数据和视图,可以使用HttpServletResponse
对象输出数据响应AJAX
请求处理
Maven
中加入依赖
<!-- pom.xml -->
<dependency>
<groudId>com.fasterxml.jackson.core</groudId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groudId>com.fasterxml.jackson.core</groudId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
把对象转为AJAX
public String doSome(HttpServletResponse res, String name, Integer age) {
ObjectMapper on = new ObjectMapper();
String json = on.writeValueAsString(student);
// 输出json,响应Ajax
res.setContentType("application/json;charset=utf-8");
PrintWriter pw = res.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
Object
返回对象Object
是数据,而ajax
请求需要的都是数据。在ajax
请求中,一般返回的是json
格式数据。
框架提供了处理java
对象到json
转换,还是数据输出工作。
HttpMessageConverter
消息转换器:是一个接口
- 作用:
- 实现请求的数据转为
Java
对象; - 把控制器方法返回的对象转为
json
、text
、xml
、二进制等不同格式的数据;
- 实现请求的数据转为
public interface HttpMessageConverter<T> {
/* 检查var1,如果能转化成MediaType返回真 */
boolean canRead(Class<?> var1, @Nullable MediaType var2);
/* 检查var1,如果能转化成MediaType返回真 */
boolean canWrite(Class<?> var1, @Nullable MediaType var2);
List<MediaType> getSupportedMediaTypes();
/* 接收请求中的对象,把数据转化成var1 */
T read(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException;
/* 把数据转化成var3,发送数据 */
void write(T var1, @Nullable MediaType var2, HttpOutputMessage var3) throws IOException, HttpMessageNotWritableException;
}
框架根据控制器方法的返回类型,自动查找使用的实现类。
默认情况下: springmvc
使用了HttpMessageConveter
接口的4个实现类。包括了StringHttpMessageConverter
。
需要在springmvc
的配置文件,加入注解驱动的标签mvc:annotation-driven
加入这个标签后,springmvc
项目
启动后,会创建HttpMessageConveter
接口的7个实现类对象, 包括StringHttpMessageConverter
和
Mappinglackson2HttpMessageConverter
。
<mvc:annotation-driven />
public Student doSome(HttpServletResponse res, String name, Integer age) {
//
return student;
}
@ResponseBody
:注解的作用,就是把student
转换后的json
通过HttpServletResponse
对象输出给浏览器。
相当于
res.setContentType("application/json;charset=utf-8");
PrintWriter pw = res.getWriter();
pw.println(json);
pw.flush();
pw.close();
控制器方法返回对象转为json
的步骤
pom.xml
加入jackson
依赖,springmvc
框架, 默认处理json
就是使用jackson
- 在
springmvc
的配置文件中,加入注解驱动的标签mvc:annotation-dirven
- 在控制器方法的上面加入
@ResponseBody
注解,表示返回值数据,输出到浏览器。
List
与Object
同理
解读url-pattern
静态资源的处理
主要是由Tomcat
进行处理的
- 提供静态资源的处理
- 处理所有未映射到其他请求的请求处理
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果在中央调度器使用
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果在项目中,中央调度器使用了\
,动态资源能访问,静态资源不能访问,因此需要处理静态资源的访问工作
第一种处理静态资源的方法:使用<mvc:default-servlet-handler/>
在springmvc
的配置文件中加入mvc:default-servlet-handler
标签,springmvc
框架会在项目运行时,加入DefaultServletHttpRequestHandler
对象,让这个对象处理静态资源的访问。
原理:DefaultServletHttpRequestHandler
把接收的静态资源的地址,转发给了tomcat
的default
优点:解决方法简单
缺点:依赖于Tomcat
服务器
<mvc:annotation-driven /> <!-- 一般与其下配置防止冲突 -->
<mvc:default-servlet-handler/>
第二种处理静态资源的方法:使用<mvc:resources/>
在springmvc
配置文件中加入一个mvc:resources
标签,框架会创建ResourceHttpRequestHandler
控制器对象,使用这个对象处理静态资源的访问。(不依赖tomcat
服务器,推荐使用)
<mvc:annotation-driven /> <!-- 一般与其下配置防止冲突 -->
<!--
mapping:访问静态资源的url地址,可以使用通配符(**)
location:静态在项目中的位置 不要使用/WEB-INF目录
-->
<mvc:resources mapping="/images/**" location=""/>
<mvc:resources mapping="/js/**" location=""/>
<mvc:resources mapping="/css/**" location=""/>
<!-- 一句话设置静态资源 -->
<mvc:resources mapping="/static/**" location=""/>
SSM整合
SSM
编程,即SpringMVC + Spring + MyBatis
整合,是当前最为流行的JavaEE
开发技术架构。其实SSM
整合的实质,仅仅就是将MyBatis
整合入Spring
。因为SpringMVC
原本就是Spring
的- -部分, 不用专门整台。SSM
整合的实现方式可分为两种:基于XML
配置方式,基于注解方式。