SpringMVC_刘锋的博客
文章目录
- 一、 回顾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找不到的问题
首先检查路径是否正确
检查相应的jar包是否导入
将所用的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_刘锋的博客相关推荐
- MySQL_DQL数据查询语言_刘锋的博客
文章目录 DQL数据查询语言 进阶一:基础查询 进阶二:条件查询 进阶三:排序查询 进阶四:常见函数 一.单行函数 二.分组函数(聚合函数) 进阶五.分组查询 进阶六:连接查询(多表查询) sql92 ...
- Spring_刘锋的博客
文章目录 一.Spring 简介 maven配置 优点 组成 拓展 二.IOC理论推导 helloSpring beans.xml Hello.class MyTest.class dao的sprin ...
- JSON_刘锋的博客
文章目录 JSON 一.什么是JSON 1.创建一个js对象 2.将js对象转换为json对象 3.将json对象转换成js对象 test.html 二.Controller返回JSON数据 Jack ...
- MySQL_TCL事务控制语言_刘锋的博客
文章目录 TCL事务控制语言 一.事务的属性(ACIB) 原子性 一致性 隔离性 持久性 二.事务的创建 隐式的事务 显式的事务 三.事务的隔离级别 脏读: 不可重复度: 幻读: 四.delete和t ...
- JDBC_刘锋的博客
文章目录 JDBC 1.JDBC概述 2.获取数据库连接 3.使用preparedstatement实现CRUD操作 增加(Create) 更新(Update) 通用的增删(delete)改 检索(R ...
- jsp中Ajax请求发送PUT、DELETE请求的方式_刘锋的博客
jsp中Ajax请求发送PUT.DELETE请求的方式 方式一 首先配置pom.xml ,添加过滤器 <filter><filter-name>hiddenHttpMethod ...
- Lombok_刘锋的博客
文章目录 概念: 使用: 常用注解: 优点: 缺点: 1. JDK版本问题 2. 胁迫使用 3. 可读性差 4. 代码耦合度增加 概念: Lombok项目是一个Java库,它会自动插入编辑器和构建工具 ...
- Maven_刘锋的博客
文章目录 ANT 概述 功能 安装 种类和之间的关系 本地仓库 远程仓库 中央仓库 设置本地仓库路径 Maven的标准目录结构 Maven常用的命令 Maven生命周期 Maven概念模型图 IDEA ...
- MySQL视图_刘锋的博客
文章目录 视图 创建视图 视图修改 视图的删除 查看视图 视图的更新 对比视图和表 视图 就是一个虚拟的表,有行有列 虚拟表是5.1之后出现的新特性,是通过普通表动态生成的数据,具有临时性的特点. 创 ...
最新文章
- //Eclipse 快捷方式
- OPNFV董事邓辉:网络功能虚拟化开源平台OPNFV介绍
- Python3 的内置函数和闭包
- pyquery获取不到网页完整源代码_PyQuery 详解
- mysql gtid 5.7_MySQL5.7之GTID复制
- [温故知新] 编程原则和模式
- php cookie 字串,php入门(字符串,cookie,session)
- java.util.base64报错解决
- 等离子显示器测试软件,等离子电视各种屏自检方法分享
- python当作为条件表达式时_2019知到Python程序设计基础(山东联盟)结课测验答案...
- 居中 html css
- 【Git/Github学习笔记】Git常用命令(版本回退)
- 计算机网络 自顶向下方法 第四章 网络层
- visualroute 很棒的一款工具
- 富士通Fujitsu DPK1180K 打印机驱动
- html中加减号,如何添加加+和减号 - 按钮,在产品列表网页(list.phtml)
- android好用的文件管理器,安卓哪种文件管理器好用 三款文件管理器横向评测
- 【速成MSP430f149】电赛期间学习MSP430f149笔记
- 【图像分类】 一文读懂AlexNet
- 分享一篇企鹅的暑期实习生技术面经验