文章目录

  • 一、 回顾servlet
    • 创建maven项目
    • 设置pom.xml依赖
    • 创建普通的子项目,添加web框架支持
    • HelloServlet
    • from.jsp
    • test.jsp
  • 二、初始Spring MVC
    • Spring MVC的特点
    • SpringMVC核心
    • 搭建SpringMVC
      • web.xml
      • springmvc-servlet.xml
      • HelloController.java
      • hello.jsp
      • 解决404找不到的问题
  • 三、springMVC原理
    • 执行流程
  • 四、注解开发SpringMVC
  • controller
    • 第一种实现方式
    • 第二种实现方式
  • 五、RequestMapping
  • 六、RestFul风格
    • 概念
    • 语法
    • 好处
  • 七、重定向和转发
    • 转发
    • 重定向
  • 八、接受请求的参数和数据的回显
  • 九、乱码问题
    • 一般使用spring自带的过滤器来解决乱码
    • 一个大神写的强大的过滤器

一、 回顾servlet

创建maven项目

设置pom.xml依赖

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies>

创建普通的子项目,添加web框架支持

HelloServlet

@WebServlet("/helloServlet")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取前端业务String method = req.getParameter("method");if (method.equals("add")) {req.getSession().setAttribute("msg","执行了add方法");}if (method.equals("delete")) {req.getSession().setAttribute("msg","执行了delete方法");}// 业务逻辑// 转发或者重定向req.getRequestDispatcher("WEB-INF/jsp/test.jsp").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

from.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>form</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/helloServlet" method="post"><input type="text" name="method"><input type="submit" value="Submit">
</form>
</body>
</html>

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
${msg}
</body>
</html>

二、初始Spring MVC

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

Spring MVC的特点

轻量级,简单易学

高效,基于请求响应的MVC框架

和Spring无缝结合

约定优于配置

功能强大 RESTful,数据验证,格式化,本地化,主题等

简洁灵活

SpringMVC核心

搭建SpringMVC

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_4_0.xsd"version="4.0"><!--注册DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--关联一个springmvc的配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

springmvc-servlet.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><!-- 由 Spring容器创建该类的实例对象 --><!--处理器映射器--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!--处理器适配器--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean><bean id="/hello" class="com.itlf.controller.HelloController"/>
</beans>

HelloController.java

public class HelloController implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {// 模型和视图ModelAndView mv = new ModelAndView();// 封装对象mv.addObject("msg", "HelloSpringMVC");// 封装要跳转的视图mv.setViewName("hello"); // /WEB_INF/jsp/hello.jspreturn mv;}
}

hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
${msg}
</body>
</html>

解决404找不到的问题

  1. 首先检查路径是否正确

  2. 检查相应的jar包是否导入

  3. 将所用的jar包放在

三、springMVC原理

执行流程

四、注解开发SpringMVC

项目结构

1、 新建maven项目,导入web框架支持

2、在pom.xml中添加maven资源过滤

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes></resource></resources></build>

3、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"><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-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

4、springmvc-servlet.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"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--扫描包--><context:component-scan base-package="com.itlf.controller"/><!--资源过滤--><mvc:default-servlet-handler/><!--注解支持--><mvc:annotation-driven/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean>
</beans>

5、HelloController.java

package com.itlf.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;/*** Created with IntelliJ IDEA.** @author: LiuF* @date: 2021/6/2* @description:* @version: 1.0*/
@Controller
public class HelloController {@RequestMapping("/h1") // 访问地址public String hello(Model model) {// 封装数据model.addAttribute("msg", "hello annotation");return "hello";  // 转发地址}}

6、hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
${msg}
</body>
</html>

controller

第一种实现方式

实现Controller接口的方式

public class ControllerTest01 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {ModelAndView mv = new ModelAndView();mv.addObject("msg", "ControllerTest01");mv.setViewName("test");return mv;}
}

并且在spring中注册bean

<bean name="/controllerTest01" class="com.itlf.controller.ControllerTest01"/>

一般不建议使用这种方式!!!

第二种实现方式

使用注解的方式去配置

@Controller
public class ControllerTest02 {//  被这个Controller注解所标注的类下的所有的方法的返回值如果是String的,在有具体的页面可以跳转的情况下,就会自动被视图解析器解析@RequestMapping("/test")// 访问位置,相当于servlet的访问地址public String test(Model model) {model.addAttribute("msg", "ControllerTest02");return "test";  // jsp。就是将要跳转的路径}
}

比较推荐使用这种方式

五、RequestMapping

可以加载class上面,也可以加在方法上面

@Controller
@RequestMapping("/c")// 父级访问
public class ControllerTest02 {@RequestMapping("/test")// 子级访问  最终的访问地址就是  .../c/testpublic String test(Model model) {model.addAttribute("msg", "ControllerTest02");return "test";  }

六、RestFul风格

概念

是一种风格,是地址的访问路径的显示风格,现在好多的网站都使用的是RestFul风格

中间是以斜杠来分隔各个传入的参数的

传统的操作资源的方式是通过不同的参数来实现不同资源的访问的,方法单一

但是这个RestFul风格是通过不同的请求的方式来实现不同的页面资源访问,请求的地址一样,也可以实现不同的功能

语法

这是之前的写法

@Controller
public class RestFulController {//    之前的请求地址的写法:http://localhost:8080/add?a=1&b=2 @RequestMapping("/add")public String test(int a, int b, Model model) {int c = a + b;model.addAttribute("msg", c);return "test";}
}

现在的写法

在springMVC中,,可以使用注解 @PathVariable 将方法的参数的值直接绑定到一个URI模板变量上

@Controller
public class RestFulController {//   现在的RestFul的风格的写法: http://localhost:8080/add/2/3@RequestMapping("/add/{a}/{b}")public String test(@PathVariable int a, @PathVariable int b, Model model) {int c = a + b;model.addAttribute("msg", c);return "test";}
}

可以限定请求的类型

有以下的多种限定请求的方式

@GetMapping("/add/{a}/{b}")
@PostMapping
@RequestMapping
@DeleteMapping
@PatchMapping
@PutMapping
@TypeMapping()
@PostMapping("/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b, Model model) {int c = a + b;model.addAttribute("msg", "PostMapping:"+c);return "test";
}
@GetMapping("/add/{a}/{b}")
public String test3(@PathVariable int a, @PathVariable int b, Model model) {int c = a + b;model.addAttribute("msg", "GetMapping:"+c);return "test";
}

好处

使路径更加的简洁

支持缓存,更加的高效

路径隐藏,更加的安全

七、重定向和转发

转发

直接返回jsp的名字,实现转发 return “test”;

 @RequestMapping("/m1/t1")public String test(Model model) {model.addAttribute("msg", "test");return "test"; // 转发}

重定向

返回 return “redirect:/index.jsp”; 实现重定向

redirect: 后面写要重定向的jsp网页地址

  @RequestMapping("/m1/t2")public String test2(Model model) {model.addAttribute("msg", "test");return "redirect:/index.jsp"; // 重定向}

八、接受请求的参数和数据的回显

前端接受的参数和从形参的名字相同

前端接受的值的名字和形参的名字不一样的情况

使用@RequestParam(“name”)来给形参匹配相应的前端的名字

public String test1(@RequestParam("name11") String name, Model model) {// 接受前端的参数System.out.println("name = " + name);// 将返回结果传递给前端model.addAttribute("msg", name);// 跳转视图return "test";
}

形参是一个对象

接受前端的参数:
如果参数的名字直接在方法的形参上,那么就直接使用
形参是一个对象,那么参数的名字就会和对象的属性的名字去匹配,不一致那么对象的属性就是一个null

// 前端接受的是一个对象 @RequestMapping("/t2")
public String test2(User user) {// 接受前端的参数System.out.println("user = " + user);// 跳转视图return "test";
}

常用的三个对象的区别

Model 只有少数的几个方法,简化了新手的操作
ModelMap 继承了 LinkedHashMap。拥有了LinkedHashMap的所有的方法和特性
modelAndView 可以在存储数据的同时设置返回逻辑视图

九、乱码问题

乱码问题一般不是前端产生的问题,这个问题是在后台的时候就出现了问题

一般使用spring自带的过滤器来解决乱码

<!--spring配置的乱码过滤器-->
<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encode</param-name><param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

一个大神写的强大的过滤器

package filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;/*** 解决get和post请求 全部乱码的过滤器*/
public class EncodingFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//处理response的字符编码HttpServletResponse myResponse = (HttpServletResponse) response;myResponse.setContentType("text/html;charset=UTF-8");// 转型为与协议相关对象HttpServletRequest httpServletRequest = (HttpServletRequest) request;// 对request包装增强HttpServletRequest myrequest = new MyRequest(httpServletRequest);chain.doFilter(myrequest, response);}public void init(FilterConfig filterConfig) throws ServletException {}}//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {private HttpServletRequest request;//是否编码的标记private boolean hasEncode;//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰public MyRequest(HttpServletRequest request) {super(request);// super必须写this.request = request;}// 对需要增强方法 进行覆盖@Overridepublic Map getParameterMap() {// 先获得请求方式String method = request.getMethod();if (method.equalsIgnoreCase("post")) {// post请求try {// 处理post乱码request.setCharacterEncoding("utf-8");return request.getParameterMap();} catch (UnsupportedEncodingException e) {e.printStackTrace();}} else if (method.equalsIgnoreCase("get")) {// get请求Map<String, String[]> parameterMap = request.getParameterMap();if (!hasEncode) { // 确保get手动编码逻辑只运行一次for (String parameterName : parameterMap.keySet()) {String[] values = parameterMap.get(parameterName);if (values != null) {for (int i = 0; i < values.length; i++) {try {// 处理get乱码values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}}hasEncode = true;}return parameterMap;}return super.getParameterMap();}//取一个值@Overridepublic String getParameter(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);if (values == null) {return null;}return values[0]; // 取回参数的第一个值}//取所有值@Overridepublic String[] getParameterValues(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);return values;}
}

SpringMVC_刘锋的博客相关推荐

  1. MySQL_DQL数据查询语言_刘锋的博客

    文章目录 DQL数据查询语言 进阶一:基础查询 进阶二:条件查询 进阶三:排序查询 进阶四:常见函数 一.单行函数 二.分组函数(聚合函数) 进阶五.分组查询 进阶六:连接查询(多表查询) sql92 ...

  2. Spring_刘锋的博客

    文章目录 一.Spring 简介 maven配置 优点 组成 拓展 二.IOC理论推导 helloSpring beans.xml Hello.class MyTest.class dao的sprin ...

  3. JSON_刘锋的博客

    文章目录 JSON 一.什么是JSON 1.创建一个js对象 2.将js对象转换为json对象 3.将json对象转换成js对象 test.html 二.Controller返回JSON数据 Jack ...

  4. MySQL_TCL事务控制语言_刘锋的博客

    文章目录 TCL事务控制语言 一.事务的属性(ACIB) 原子性 一致性 隔离性 持久性 二.事务的创建 隐式的事务 显式的事务 三.事务的隔离级别 脏读: 不可重复度: 幻读: 四.delete和t ...

  5. JDBC_刘锋的博客

    文章目录 JDBC 1.JDBC概述 2.获取数据库连接 3.使用preparedstatement实现CRUD操作 增加(Create) 更新(Update) 通用的增删(delete)改 检索(R ...

  6. jsp中Ajax请求发送PUT、DELETE请求的方式_刘锋的博客

    jsp中Ajax请求发送PUT.DELETE请求的方式 方式一 首先配置pom.xml ,添加过滤器 <filter><filter-name>hiddenHttpMethod ...

  7. Lombok_刘锋的博客

    文章目录 概念: 使用: 常用注解: 优点: 缺点: 1. JDK版本问题 2. 胁迫使用 3. 可读性差 4. 代码耦合度增加 概念: Lombok项目是一个Java库,它会自动插入编辑器和构建工具 ...

  8. Maven_刘锋的博客

    文章目录 ANT 概述 功能 安装 种类和之间的关系 本地仓库 远程仓库 中央仓库 设置本地仓库路径 Maven的标准目录结构 Maven常用的命令 Maven生命周期 Maven概念模型图 IDEA ...

  9. MySQL视图_刘锋的博客

    文章目录 视图 创建视图 视图修改 视图的删除 查看视图 视图的更新 对比视图和表 视图 就是一个虚拟的表,有行有列 虚拟表是5.1之后出现的新特性,是通过普通表动态生成的数据,具有临时性的特点. 创 ...

最新文章

  1. //Eclipse 快捷方式
  2. OPNFV董事邓辉:网络功能虚拟化开源平台OPNFV介绍
  3. Python3 的内置函数和闭包
  4. pyquery获取不到网页完整源代码_PyQuery 详解
  5. mysql gtid 5.7_MySQL5.7之GTID复制
  6. [温故知新] 编程原则和模式
  7. php cookie 字串,php入门(字符串,cookie,session)
  8. java.util.base64报错解决
  9. 等离子显示器测试软件,等离子电视各种屏自检方法分享
  10. python当作为条件表达式时_2019知到Python程序设计基础(山东联盟)结课测验答案...
  11. 居中 html css
  12. 【Git/Github学习笔记】Git常用命令(版本回退)
  13. 计算机网络 自顶向下方法 第四章 网络层
  14. visualroute 很棒的一款工具
  15. 富士通Fujitsu DPK1180K 打印机驱动
  16. html中加减号,如何添加加+和减号 - 按钮,在产品列表网页(list.phtml)
  17. android好用的文件管理器,安卓哪种文件管理器好用 三款文件管理器横向评测
  18. 【速成MSP430f149】电赛期间学习MSP430f149笔记
  19. 【图像分类】 一文读懂AlexNet
  20. 分享一篇企鹅的暑期实习生技术面经验

热门文章

  1. 【数据结构】 天勤 2.2.6 逆序问题
  2. oracle中的CURRVAL和NEXTVAL用法(sequence是序列号生成器)
  3. 【测试用例设计】测试用例基本概念
  4. FormPanel,EditorGridPanel的赋值和传参、数据的保存删除
  5. 中国名校计算机专业分析介绍
  6. photon Unity RPC 调用流程
  7. Layer分页,Ajax请求分页
  8. 用python写一个贪吃蛇代码
  9. 模拟退火算法及马尔科夫链
  10. python爬虫破解字体加密案例