一 SpringMVC简介

SpringMVC是Spring提供的一个强大而灵活的Web框架 借助于注解 SpringMVC提供了几乎是POJO的开发模式 使得控制器的开发和测试更加简单

二 SpringMVC优点

1. 角色划分清晰

2. 分工明确 而且扩展相当灵活

3. 和Spring其它框架无缝集成 是其它Web框架所不具备的

4. 功能强大的数据验证 格式化 绑定机制

5. 约定大于配置的契约式编程支持 基于注解的零配置支持等等

三 SpringMVC框架核心

DispatcherServlet 前端控制器

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

HandlerMapping 处理器映射器

SpringMVC三大组件之一 HandlerMapping负责根据用户请求URL找到Handler即处理器 SpringMVC提供了不同的映射器实现不同的映射方式 比如配置文件方式 实现接口方式 注解方式等等

Handler 处理器

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

HandlAdapter 处理器适配器

SpringMVC三大组件之一 通过HandlerAdapter对处理器进行执行 这是适配器模式的应用 通过扩展适配器可以对更多类型的处理器进行执行

ViewResolver 视图解析器

SpringMVC三大组件之一 ViewResolver负责将处理结果生成View视图 ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址 再生成View视图对象 最后对View进行渲染将处理结果通过页面展示给用户

View 视图

SpringMVC提供了很多View视图类型的支持 比如FreemarkerView PDFView等等 最常用的视图就是JSP 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户 需要程序员根据业务需求开发具体的页面

四 SpringMVC初体验

1. 新建一个Maven项目

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hy.springmvc</groupId>
<artifactId>springmvc-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <!-- 定义依赖版本号 -->
<properties>
<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<jstl.version>1.2</jstl.version>
<spring.version>5.0.5.RELEASE</spring.version>
<jackson-databind.version>2.9.5</jackson-databind.version>
<commons-fileupload.version>1.3.3</commons-fileupload.version>
</properties> <!-- 管理jar版本号 -->
<dependencyManagement>
<dependencies>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- jackson(spring mvc need) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind.version}</version>
</dependency>
<!-- fileupload(spring mvc need) -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- jackson(spring mvc need) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- fileupload(spring mvc need) -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<!-- 编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- tomcat7 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>

2. 新建webapp文件夹及子文件夹和web.xml

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <!-- 处理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> <!-- 前端控制器 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-mvc.xml</param-value>
</init-param>
<!-- 配置SpringMVC启动时机
1. 第一次被访问时启动 值为负数
2. 随着容器启动而启动 值为0或正数 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<!-- 拦截所有(不包含jsp 包含js png css...) -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

3. 创建jsp webapp/WEB-INF/jsp/index.jsp webapp/WEB-INF/jsp/success.jsp webapp/WEB-INF/jsp/exception.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.1.min.js"></script>
<script type="text/javascript">
var param = '{"name":"祎哥哥", "age":18}';
function json() {
$.ajax({
url: "${pageContext.request.contextPath}/test/postBody",
data: param,
contentType: "application/json;charset=UTF-8",
type: "post",
dataType: "json",
success: function (data) {
alert(data.name + ", " + data.age);
}
});
}
</script>
</head>
<body> <h3>初体验</h3> ${message}<br/><br/> <a href="${pageContext.request.contextPath}/test/forward">转发</a><br/><br/> <a href="${pageContext.request.contextPath}/test/redirect">重定向</a><br/><br/> <a href="${pageContext.request.contextPath}/test/error">异常处理</a><br/><br/> <a href="${pageContext.request.contextPath}/test/get?name=hy&age=18">GET请求 /test/get?name=hy&age=18</a><br/><br/> <a href="${pageContext.request.contextPath}/test/getPath/黄祎">GET请求 /test/getPath/黄祎</a><br/><br/> <p>普通表单 普通类型参数绑定 List类型参数绑定</p>
<form action="${pageContext.request.contextPath}/test/postList" method="post">
姓名 <input type="text" name="name"/><br/>
年龄 <input type="text" name="age"/><br/>
爱好 <input type="checkbox" name="hobby" value="1"/>红中
<input type="checkbox" name="hobby" value="2"/>发财
<input type="checkbox" name="hobby" value="3"/>白板<br/>
<input type="submit" value="提交"/>
</form> <p>普通表单 普通类型参数绑定 数组类型参数绑定</p>
<form action="${pageContext.request.contextPath}/test/postArray" method="post">
姓名 <input type="text" name="name"/><br/>
年龄 <input type="text" name="age"/><br/>
爱好 <input type="checkbox" name="hobby" value="1"/>红中
<input type="checkbox" name="hobby" value="2"/>发财
<input type="checkbox" name="hobby" value="3"/>白板<br/>
<input type="submit" value="提交"/>
</form> <p>普通表单 Model类型参数绑定</p>
<form action="${pageContext.request.contextPath}/test/postModel" method="post">
姓名 <input type="text" name="name"/><br/>
年龄 <input type="text" name="age"/><br/>
爱好 <input type="checkbox" name="hobby" value="1"/>红中
<input type="checkbox" name="hobby" value="2"/>发财
<input type="checkbox" name="hobby" value="3"/>白板<br/>
<input type="submit" value="提交"/>
</form> <p>文件表单 单文件</p>
<form action="${pageContext.request.contextPath}/test/postSingleFile" enctype="multipart/form-data" method="post">
姓名 <input type="text" name="name"/><br/>
文件 <input type="file" name="file"/><br/>
<input type="submit" value="提交"/>
</form> <p>文件表单 多文件</p>
<form action="${pageContext.request.contextPath}/test/postMoreFile" enctype="multipart/form-data" method="post">
姓名 <input type="text" name="name"/><br/>
文件 <input type="file" name="file"/>
<input type="file" name="file"/><br/>
<input type="submit" value="提交"/>
</form> <input type="button" value="请求体是json格式字符串" onclick="json()"/> </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> <h3>成功了</h3> ${user.toString()} </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> <h3>出错了</h3> ${error.toString()} </body>
</html>

4. 配置常量 resources/resource.properties

### 常量 ###
NAME=HUANGYI

5. 创建配置文件 resources/spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"> <!-- 引入配置文件 -->
<context:property-placeholder location="classpath:*.properties" /> <!-- 扫描的位置 -->
<context:component-scan base-package="com.hy.springmvc.controller" /> <!-- 注解驱动 -->
<mvc:annotation-driven /> <!-- 文件上传实现类 id名称必须固定 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 文件上传大小(单位B) 5M = 5 * 1024 * 1024 -->
<property name="maxUploadSize" value="5242880" />
</bean> <!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 逻辑视图前缀 -->
<property name="prefix" value="/WEB-INF/jsp" />
<!-- 逻辑视图后缀 -->
<property name="suffix" value=".jsp" />
</bean> <!-- 加载静态资源 -->
<mvc:default-servlet-handler /> <!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有 -->
<mvc:mapping path="/**" />
<bean class="com.hy.springmvc.interceptor.Interceptor" />
</mvc:interceptor>
<!-- 多个拦截器 拦截器会顺序执行 -->
<!--<mvc:interceptor>-->
<!--<mvc:mapping path="/**" />-->
<!--<bean />-->
<!--</mvc:interceptor>-->
</mvc:interceptors> <!-- 异常处理器 -->
<bean class="com.hy.springmvc.exception.HttpErrorResolver" />
</beans>

6. 创建实体类 com.hy.springmvc.model.User com.hy.springmvc.model.HttpError

public class User {

    private String name;
private Integer age;
private Integer[] hobby; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Integer[] getHobby() {
return hobby;
} public void setHobby(Integer[] hobby) {
this.hobby = hobby;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", hobby=" + Arrays.toString(hobby) +
'}';
}
}
public class HttpError extends Exception {

    private int code;
private String message; public HttpError() {} public HttpError(int code, String message) {
this.code = code;
this.message = message;
} public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} @Override
public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} @Override
public String toString() {
return "HttpError{" +
"code=" + code +
", message='" + message + '\'' +
'}';
}
}

7. 创建拦截器 com.hy.springmvc.interceptor.Interceptor

public class Interceptor implements HandlerInterceptor {

    // Controller执行前调用此方法
// 返回true继续执行 返回false中止执行
// 这里可加入登录校验 权限拦截等
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(" ========== preHandle ========== ");
// 放行
return true;
} // Controller执行后 且未返回视图前 调用此方法
// 这里可在返回用户前对模型数据进行加工处理 比如这里加入公用信息以便页面显示
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {} // Controller执行后 且视图返回后 调用此方法
// 这里可得到执行Controller时的异常信息
// 这里可记录操作日志
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {}
}

8. 创建异常处理器 com.hy.springmvc.exception.HttpErrorResolver

public class HttpErrorResolver implements HandlerExceptionResolver {

    @Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
// Object o 发生异常的具体位置
System.out.println("resolveException = " + o.toString());
// 写日志记录 发邮件提醒 if (System.currentTimeMillis() % 2 == 0) {
/** 有视图 **/
HttpError error = e instanceof HttpError ? (HttpError) e : new HttpError(-1, "未知异常");
ModelAndView view = new ModelAndView();
view.addObject("error", error);
view.setViewName("/exception");
return view; } else {
/** 无视图 **/
HttpError error = e instanceof HttpError ? (HttpError) e : new HttpError(-1, "未知异常");
try {
response.setContentType("text/html;charset=UTF-8"); //解决返回中的中文乱码
PrintWriter writer = response.getWriter();
writer.write(error.toString());
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
return null;
}
}
}

9. 创建控制器 com.hy.springmvc.controller.TestController

@Controller
@RequestMapping("/test")
public class TestController { @Value("${NAME}")
private String NAME; /**
* @param model Model
* @param accept @RequestHeader 获取指定请求头的值
* @return 资源路径
*/
@RequestMapping("/index")
public String index(Model model, @RequestHeader("Accept") String accept) {
model.addAttribute("message", NAME + " " + accept);
return "/index";
} /**
* 转发
* @return Mapping路径
*/
@RequestMapping("/forward")
public String forward() {
return "forward:index";
} /**
* 重定向
* @return Mapping路径
*/
@RequestMapping("/redirect")
public String redirect() {
return "redirect:index";
} /**
* 异常处理
* @return 资源路径
*/
@RequestMapping("/error")
public String error() {
int i = 1 / 0; //模拟异常
return "/index";
} /**
* @RequestMapping 作用在类上=第一级访问目录 作用在方法上=第二级访问目录
* path=指定请求路径 path=指定请求方法 params=指定限制请求参数的条件 headers=指定限制请求头的条件
* @param model Model
* @param name 普通类型参数绑定
* @param age @RequestParam 把请求中指定名称的参数传递给控制器中形参赋值
* name=请求参数中的名称 required=请求参数中是否必须提供此参数 defaultValue=默认值
* @return 资源路径
*/
@RequestMapping(path = "/get", method = RequestMethod.GET)
public String get(Model model, String name, @RequestParam(name = "age", required = true, defaultValue = "0") Integer age) {
User user = new User();
user.setName(name);
user.setAge(age);
model.addAttribute("user", user);
return "/success";
} /**
* @param model Model
* @param name @PathVariable 绑定url中的占位符
* @return 资源路径
*/
@GetMapping("/getPath/{name}")
public String getPath(Model model, @PathVariable String name) {
User user = new User();
user.setName(name);
model.addAttribute("user", user);
return "/success";
} /**
* @ResponseBody 将方法的返回值 以特定格式写入到响应体
* @param name 普通类型参数绑定
* @param age 普通类型参数绑定
* @param hobby List类型参数绑定 必须添加@RequestParam
* @return json格式字符串
*/
@PostMapping("/postList")
@ResponseBody
public User postList(String name, Integer age, @RequestParam List<Integer> hobby) {
Integer[] array = hobby.toArray(new Integer[0]);
User user = new User();
user.setName(name);
user.setAge(age);
user.setHobby(array);
return user;
} /**
* @param name 普通类型参数绑定
* @param age 普通类型参数绑定
* @param hobby 数组类型参数绑定
* @return json格式字符串
*/
@PostMapping("/postArray")
@ResponseBody
public User postArray(String name, Integer age, Integer[] hobby) {
User user = new User();
user.setName(name);
user.setAge(age);
user.setHobby(hobby);
return user;
} /**
* @param user Model类型参数绑定
* @return json格式字符串
*/
@PostMapping("/postModel")
@ResponseBody
public User postModel(User user) {
return user;
} /**
* @param request HttpServletRequest
* @param name 普通类型参数绑定
* @param file 单文件
* @return json格式字符串
* @throws Exception 异常
*/
@PostMapping("/postSingleFile")
@ResponseBody
public User postSingleFile(HttpServletRequest request, String name, MultipartFile file) throws Exception {
String path = saveFile(request, file);
User user = new User();
user.setName(name + ", " + path);
return user;
} /**
* @param request HttpServletRequest
* @param name 普通类型参数绑定
* @param file 多文件
* @return json格式字符串
* @throws Exception 异常
*/
@PostMapping("/postMoreFile")
@ResponseBody
public User postMoreFile(HttpServletRequest request, String name, MultipartFile[] file) throws Exception {
StringBuilder builder = new StringBuilder();
if (null != file && 0 != file.length) {
for (MultipartFile multipartFile : file) {
String path = saveFile(request, multipartFile);
builder.append(" ").append(path);
}
}
User user = new User();
user.setName(name + "," + builder.toString());
return user;
} /**
* @param user @RequestBody 用于获取请求体的内容
* @return json格式字符串
*/
@PostMapping("/postBody")
@ResponseBody
public User postBody(@RequestBody User user) {
return user;
} private String saveFile(HttpServletRequest request, MultipartFile file) throws Exception {
if (null != file && !file.isEmpty()) {
String fileName = UUID.randomUUID().toString().replace("-", ""); //文件名
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
String path = request.getServletContext().getRealPath("/upload") + "/" + fileName + substring;
file.transferTo(new File(path));
return path;
}
return "";
}
}

SpringMVC大威天龙的更多相关文章

  1. 2. Servlet3.0注解方式 @WebServlet

    web.xml配置还是比较麻烦,这次使用注解方式 编写servlet import javax.servlet.ServletException; import javax.servlet.annot ...

  2. PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

    一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结器队列 ...

  3. SpringMVC知识大览

    SpringMVC大览 springMVC的基础知识 什么是SpringMVC? springmvc框架原理(掌握) 前端控制器.'处理映射器.处理适配器.视图解析器 springmvc的入门程序 目 ...

  4. Java面试之SpringMVC总结以及在面试中的一些问题.

    1.简单的谈一下SpringMVC的工作流程? 流程 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理 ...

  5. strust1与strust2,springmvc三者之间的区别?

    strust1与struts2的区别    1.struts2是基于webWork的一个全新的框架,比struts1学习更方便    Struts2主要是改进了Struts1的servlet和acti ...

  6. 是否要学SpringMVC

    如题,希望大侠们指出,不能用Spring就觉得他什么都好,本帖子意在实际工作中,对是否将Spring引入项目及如何更好的使用Spring提出启发式意见.目前已有高人表达了自己对Spring的不满,让我 ...

  7. SpringMVC与Struts2区别与比较总结

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...

  8. <转>SpringMVC与Struts2 比较总结

    原链接:http://blog.csdn.net/chenleixing/article/details/44570681 个人整理: 1.级别不同:SpringMVC :方法  Struts是 类级 ...

  9. Struts2和SpringMVC的区别

    简单谈一下Struts2和SpringMVC的区别,文章有所引用知乎所对应的答案数据,和所查看的其余资料数据,进行一个简单的汇总,后续查看时使用: 知乎解释链接为:https://www.zhihu. ...

随机推荐

  1. 五大高效的PDF文件搜索引擎

    当你花了半个多小时在线搜索PDF文档,却发现您找到的文档都不是您需要的PDF格式.如前说述,您可以先打开PDF文档查看是不是PDF格式的,然后再到web浏览器中下载该文档.那么,为了确保您获得的文档是 ...

  2. Java历史[史上最详细的阐述了Java发展的历史过程]

    Java历史 学习Java语言之前,我觉得大家应该是从头开始,对吧?不管你之前是学过还是没学过,都和学习某一个知识一样,从头开始去了解它,然后到这个深入的掌握,到最后你可能理解并且灵活的运用.所以它肯 ...

  3. A - New Building for SIS

    You are looking at the floor plan of the Summer Informatics School's new building. You were tasked w ...

  4. 前端 /deep/ 深入样式(很深入的那种哦) 简单收藏

    简单介绍:使用vue脚手架和elemen-ui开发的前端项目  遇到这样的场景: 对div下的el-select下拉组件 设置样式,直接在标签上用style属性是完全可以的,但我们的开发规范是前端样式 ...

  5. springboot(五)使用FastJson返回Json视图

    FastJson简介: fastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作Json的序列化与反序列化的组件.它是目前json解析最快的开源组件没有之一!在这之前jaskJs ...

  6. iPhone截长图的方法

    iPhone手机暂没有长图截取功能,所以我们只能通过别的方式进行长图截取. (2020年4月10日更新) ios13目前可以截长图了,不过只能在Safari中进行长图截取,而且存储形式为pdf格式,下 ...

  7. python基础--14大内置模块(下)

    (9)正则表达式和re模块(重点模块) 在我们学习这个模块之前,我们先明确一个关系.模块和实际工作的关系. 1)模块和实际工作时间的关系 1.time模块和时间是什么关系?time模块和时间本身是没有 ...

  8. 机器学习笔记簿 降维篇 LDA 01

    机器学习中包含了两种相对应的学习类型:无监督学习和监督学习.无监督学习指的是让机器只从数据出发,挖掘数据本身的特性,对数据进行处理,PCA就属于无监督学习,因为它只根据数据自身来构造投影矩阵.而监督学 ...

  9. Python字典内置函数和方法

    Python字典内置函数和方法: 注:使用了 items.values.keys 返回的是可迭代对象,可以使用 list 转化为列表. len(字典名): 返回键的个数,即字典的长度 # len(字典 ...

  10. 10-9 重要的内置函数(zip、filter、map、sorted)

    reverse----reversed l = [1,2,3,4,5,6] l.reverse() #不会保留原列表 print(l) l =[1,2,3,4,5,6] l2 = reversed(l ...