B039-SpringMVC基础

news2025/2/2 2:01:26

目录

      • SpringMVC简介
      • 复习servlet
      • SpringMVC入门
        • 导包
        • 配置前端控制器
        • 编写处理器
          • 实现Contoller接口
          • 普通类加注解(常用)
        • 路径问题
        • 获取参数的方式
        • 过滤器简介
          • 自定义过滤器
          • 配置框架提供的过滤器
        • springMVC向页面传值的三种方式
        • 视图解析器
        • springMVC的转发和重定向

SpringMVC简介

1.SpringMVC是一个基于MVC模式的WEB/表现层框架,它解决WEB开发中常见的问题:参数接收、文件上传/下载、表单验证、国际化等等;
2.SpringMVC作为Spring框架一个非常重要的功能模块,可以与Spring无缝集成,提高开发效率;
3.Spring是一个轻量级的Java 开发框架,为了解决企业应用开发的复杂性而创建。SpringMVC以Spring框架为核心,为应用程序中的Web层(表现层)提出的一套优秀的解决方案;
4.目前很多公司都使用SpringMVC,90%的招聘单位要求熟悉使用SpringMVC;
注意:SpringMvc的功能就是之前Servlet的功能,可以理解为使用SpringMVC代替了Servlet;
在这里插入图片描述

复习servlet

见代码:
创建动态web工程 - HelloServlet - web.xml - Tomcat

HelloServlet

public class HelloServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		System.out.println("进来了");
	}
}

web.xml

  <servlet>
  	<servlet-name>helloServlet</servlet-name>
  	<servlet-class>cn.ming.controller.HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>helloServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

部署到Tomcat,浏览器访问localhost/hello

tips:
1.Target runtime:选上tomcat后就自动导入了相关jar包,不用再去lib添加相关jar包
2.Dynamic web module version:选3.0以上版本,因为支持注解,如@webservlet
3.创建动态web工程后怎么修改classes路径?
项目右键 - build path - Configure Build Path - source - 放到WEB-INF下的classes
4.为什么部署到webapp而不是部署到项目根目录?
因为WEB-INF下有看不到的classes路径,外面的java代码已编译到里面

SpringMVC入门

导包

SpringMvc是Spring的一个模块,所以要用SpringMvc需要导入Spring的jar包
在这里插入图片描述
tips:动态web工程一般导完包后会自动编译,不用手动build path

配置前端控制器

以前servlet的方式
在这里插入图片描述
现在的方式
在这里插入图片描述
前端控制器就是springMVC提供的servlet,接收所有请求但不处理请求,发给处理器即一个个方法去处理,所以需要配置前端控制器

web.xml

  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 前端控制器 人家写好的servlet -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 加载SpringMVC的核心配置文件 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!-- Tomcat启动就初始化servlet -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 请求路径 -->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

springMVC.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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    
</beans>
编写处理器

业务处理控制器的三种实现:
1.实现Contoller接口
2.实现HttpRequestHandler接口
3.普通类加注解(常用)

实现Contoller接口

HelloController

public class HelloController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
		System.out.println("我是HelloController");
		return null;
	}

}

springMVC.xml

<bean name="/hello.do" class="cn.ming.controller.HelloController"></bean>

web.xml

  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 请求路径 -->
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
普通类加注解(常用)

上面这两种太局限:方法名固定了,参数固定,返回值固定,还要实现一个接口。所以后面都用第三种

HiController

@Controller	  // 代表当前这个类就是controller 交给spring管理  不用再配置bean
//@RequestMapping("/hi")
public class HiController {

	@RequestMapping("/hello.do")
	public void handler1() {
		System.out.println("我回来了");
	}
	
	public void handler2() {
		
	}
	
	public void handler3() {
		
	}
}

springMVC.xml

	<!-- 开启扫描包路径 -->
	<context:component-scan base-package="cn.ming.controller" />
路径问题

后缀匹配:匹配的范围太小
/*:匹配所有请求,会将css,html,jsp都匹配上,一般用在过滤器,对于restful不友好
/:匹配所有请求,最常用,不会拦截.jsp,但是会拦截静态资源(css,html,images)(/替代了tomcat中默认处理静态资源的Servlet),所以需要配置静态资源放行,但是这又会导致@RequestMapping等注解失效,所以还要加上使spring注解生效的配置

代码:
web.xml

  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 请求路径 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

springMVC.xml

	<!-- 放行静态资源 -->
	<mvc:default-servlet-handler/>
	<!-- 使spring注解生效 @RequestMapping-->
	<mvc:annotation-driven />

webapp下新建index.html

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>hello world</h1>
</body>
</html>

HiController

@Controller	  // 代表当前这个类就是controller 交给spring管理  不用再配置bean
//@RequestMapping("/hi")
public class HiController {

	@RequestMapping("/hello.do")
	public void handler1() {
		System.out.println("我回来了");
	}
	
	@RequestMapping("/hi.do")
	public void handler2() {
		System.out.println("hi.do。。");
	}
	
	@RequestMapping("/hei")
	public void handler3() {
		System.out.println("hei.....");
	}
}

启动tomcat分别测试访问页面和controller

获取参数的方式

tips:浏览器访问默认发get请求,表单可以自己选发get或post

ParamController

/**
 * springMVC接收参数的四种方式
 */
@Controller
public class ParamController {

	/**
	 * 一般不用  以前的方式
	 * http://localhost/handler1?name=zs
	 */
	@RequestMapping("/handler1") // 请求的路径
	public void handler1(HttpServletRequest request){
		String name = request.getParameter("name");
		System.out.println(name);
	}
	
	/**
	 * 常用   重点   类型要符合,名称要相同
	 * http://localhost/handler2?name=ls&age=18
	 */
	@RequestMapping("/handler2") // 请求的路径
	public void handler2(String name,Integer age){
		System.out.println(name);
		System.out.println(age);
	}
	
	/**
	 * 常用  重点   对象接收参数    
	 * http://localhost/handler3?name=ls&age=18
	 */
	@RequestMapping("/handler3") // 请求的路径
	public void handler3(User user){
		System.out.println(user);
	}
	
	/**
	 * 暂时不用   restful风格方式   
	 * localhost:80/handler4/zs/30
	 */
	@RequestMapping("/handler4/{name}/{age}") // 请求的路径
	public void handler4(@PathVariable("name")String name, @PathVariable("age")Integer age){
		System.out.println(name);
		System.out.println(age);
	}
}

启动tomcat,浏览器访问

过滤器简介

tips:浏览器地址栏默认都是get,发post请求可以用表单指定,get请求在tomcat里自己解决了中文乱码,而post需要自己解决中文乱码
代码里每个处理器都设置字符集太麻烦,所以现在用filter过滤器

filter:过滤器
作用:乱码问题,过滤非法字符
执行时机:请求到达前端控制器之前
在这里插入图片描述
在这里插入图片描述

自定义过滤器

form.html

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/handler3" method="post">
		name: <input type="text" name="name"><br/>
		age: <input type="text" name="age"><br/>
		<input type="submit" value="提交">
	</form>
</body>
</html>

MyFilter

public class MyFilter implements Filter{

	//初始化方法
	@Override
	public void init(FilterConfig arg0) throws ServletException {

	}

	//处理具体的内容
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("filter。。。。。。");
		// 处理乱码问题
		req.setCharacterEncoding("utf-8");
		// 放行
		chain.doFilter(req, resp);
	}

	//销毁方法
	@Override
	public void destroy() {

	}

}

web.xml

  <filter>
  	<filter-name>myFilter</filter-name>
  	<filter-class>cn.ming.filter.MyFilter</filter-class>
  </filter>
  
  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

浏览器访问

配置框架提供的过滤器

web.xml

  <!-- 我们用框架提供的支持UTF-8编码的过滤器 -->
  <filter>
    <filter-name>characterEncoding</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>
    <!--强制指定字符编码,即使request或response设置了字符编码,也会强制使用当前设置的,任何情况下强制使用此编码-->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
springMVC向页面传值的三种方式

方式一:
DataController

@Controller
@RequestMapping("/data")
public class DataController {

	/**
	 * 向页面传值方式一:  不常用。。。
	 */
	@RequestMapping("/handler1")
	public ModelAndView handler1(){		
		ModelAndView mv = new ModelAndView();
		// 向request域存值
		mv.addObject("name","tom");
		mv.addObject("age",30);		
		// 跳转到页面
		mv.setViewName("/WEB-INF/views/data.jsp");
		return mv;
	}
	
	/**
	 * 向页面传值方式二: 常用
	 */
	@RequestMapping("/handler2")
	public String handler2(Model model){
		// 向request域存值
		model.addAttribute("name", "王天霸");
		model.addAttribute("age", "40");
		return "/WEB-INF/views/data.jsp";
	}
	
	/**
	 * 向页面传值方式三 : 常用
	 */
	@RequestMapping("/handler3")
	public String handler3(Map<String,Object> map){
		// 向request域存值
		map.put("name", "力很弱");
		map.put("age", 60);
		return "/WEB-INF/views/data.jsp";   //返回页面
	}
}

data.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	${name}<br/>
	${age}
</body>
</html>
视图解析器

视图解析器:把页面的前后缀配置起来,后面就都只需要简写

springMVC.xml

 	<!-- 视图解析器  prefix+return+suffix = /WEB-INF/views/data.jsp -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>	
	</bean>

DataController

	/**
	 * 向页面传值方式三 : 常用
	 */
	@RequestMapping("/handler3")
	public String handler3(Map<String,Object> map){
		// 向request域存值
		map.put("name", "力很弱");
		map.put("age", 60);
		return "data";   //返回页面
	}
springMVC的转发和重定向

DataController

	/**
	 * 转发和重定向
	 * 使用forward(转发)和redirect(重定向)都不会走视图解析器,但它们之间的区别还是存在
	 */
	@RequestMapping("/handler4")
	public String handler4(){
		// 默认是转发   走视图解析器
		// return "data";
		// 不走视图解析器   forward:转发
		// return "forward:/index.html";
		// 不走视图解析器   redirect:重定向
		return "redirect:/index.html";
	}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB 单机安装部署

文章目录 说明1. 下载安装包2. 安装数据库3. 配置 systemctl4. 创建 root 用户 说明 本篇文章介绍 MongoDB 二进制安装的步骤&#xff0c;整个过程还是比较简单。 1. 下载安装包 进入 MongoDB 官网&#xff0c;获取安装包的下载链接&#xff1a; https://www.mongodb.com/tr…

Node.js安装部署

Node.js安装部署 在 Windows 上安装 Node.js1.使用安装程序2.使用包管理器 Chocolatey 安装 在 macOS 上安装 Node.js1.使用 Homebrew 安装 在 Linux 上安装 Node.js1.使用包管理器安装2.使用 Node.js 官方二进制包 安装完成验证 Node.js 是一个基于 Chrome V8 引擎的 JavaScri…

2023年12月21日开发正式版v1.2.3更新·本次更新30多个细节优化·完善丰富后台功能·加入演员关联机制

2023年12月21日开发正式版v1.2.3更新本次更新30多个细节优化完善丰富后台功能加入演员关联机制 产品简介 安卓苹果PCH5四端&#xff0c;蜻蜓z暗影版的衍生级版本&#xff0c;2023年优雅草蜻蜓z冬季雪花限定版&#xff0c;不仅继承了蜻蜓z的精良功能&#xff0c;还特色增加了弹…

基于深度学习的森林火焰烟雾检测系统(含UI界面,yolov8、Python代码,数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

【Linux 驱动】Linux设备树(四)—— 设备树驱动LED

有了设备树以后&#xff0c;我们可以将寄存器信息保存到设备树&#xff0c;即便是更换了一个设备&#xff0c;我们也无需修改驱动文件&#xff0c;只需要修改设备树文件并重新编译。 下面介绍两种通过设备树驱动 LED 的最简单的方式&#xff0c;这两种方式的主要是设备树中 re…

轻量Http客户端工具VSCode和IDEA

文章目录 前言Visual Studio Code 的插件 REST Client编写第一个案例进阶&#xff0c;设置变量进阶&#xff0c;设置Token 前言 作为一个WEB工程师&#xff0c;在日常的使用过程中&#xff0c;HTTP请求是必不可少的。我们采用的HTTP工具有如下&#xff1a; Postman Insomnia Ap…

从零实现一套低代码(保姆级教程) --- 【4】实现右侧属性面板

摘要 继画布区的实现之后&#xff0c;来到本系列的第四篇文章&#xff0c;如果你没有看过之前的文章&#xff0c;可以建议先看一下第一篇文章&#xff0c;里面介绍了要实现的项目&#xff0c;是否是你要学习的内容&#xff0c;再决定是否要学习这一些列的文章。 从零实现一套低…

雄雄的小课堂微信机器人流程图

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 最近改造了下微信机器人&#xff0c;新版本还未上线&#xff0c;预计下周一&#xff08;12.25&#xff09;左右能上线第一版。 下面是改造之后的流程图 大家可以看看&#xff0c;有疑问可…

【万能技巧】IP知识速通与小技巧~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构 三、IP实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP3.3 使用IPIDEA进行爬虫实操 前言 各位友友&#xff0c;大家好&#xff0c;马上就到2024年了&#xff0c;…

MyBatis 关联查询

目录 一、一对一查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a; 2、创建account和user实体类 3、创建AccountMapper 接口 4、创建并配置AccountMapper.xml 5、测试 二、一对多查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a;…

充电桩负载测试的影响是什么

充电桩负载测试是评估充电桩性能和稳定性的重要环节&#xff0c;其影响主要体现在以下几个方面&#xff1a; 1. 安全性&#xff1a;充电桩负载测试可以检测充电桩在高负载情况下的电气安全性能&#xff0c;如电压、电流、温度等参数是否在正常范围内。如果充电桩在高负载下出现…

【圣诞】极安云科赠书活动第①期:CTF实战:从入门到提升

【圣诞】极安云科赠书活动第①期&#xff1a;CTF实战:从入门到提升 9787111724834 9787121376955 9787302556275 ISBN编号&#xff1a;9787111724834 书名&#xff1a;CTF实战:从入门到提升 定&#xff1a;99.00元 开本&#xff1a;184&#xff4d;&#xff4d;260&#xff…

Android:安卓学习笔记之OkHttp原理的简单理解和使用

Android OkHttp使用原理的简单理解和使用 OkHttp 0、前言1、请求与响应流程 1.1 请求的封装1.2 请求的发送1.3 请求的调度1.4 请求的处理2、拦截器 2.1 RetryAndFollowUpInterceptor2.2 BridgeInterceptor2.3 CacheInterceptor 2.3.1、HTTP缓存原理2.3.2、强制缓存2.3.3、协商…

Linux网络编程(一):网络基础(下)

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 网络编程 1. 协议的概念 1.1 什么是协议 从应用的角度出发&#xff0c;协议可理解为 “规则”&#xff0c;是数据传输和数据解释的规则 假设&#xff0c;A、B双方欲传输文件&#xff0c;规定&#xff1a; 第一次&#xff…

云闪付支付:一种新型的移动支付方式

随着科技的发展&#xff0c;我们的生活方式也在不断地改变。其中&#xff0c;移动支付已经成为我们生活中不可或缺的一部分。而在这个领域中&#xff0c;云闪付支付无疑是一种新型的、高效便捷的支付方式。那么&#xff0c;云闪付支付究竟是什么&#xff0c;它又有哪些特点呢&a…

2023年12月23日 十二生肖 今日运势

小运播报&#xff1a;2023年12月23日&#xff0c;星期六&#xff0c;农历十一月十一 &#xff08;癸卯年甲子月乙卯日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;狗、猪、羊 需要注意&#xff1a;鼠、龙、鸡 喜神方位&#xff1a;西北方 财神方位&#xff…

Java 虚拟机中的内存结构

1 内存结构 1.1 程序计数器 1.1.1 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条 jvm 指令的执行地址 特点&#xff1a; 是线程私有的&#xff08;每个线程独有自己的一份&#xff09;不会存在内存溢出 1.1.2 作…

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

设计模式:循序渐进走入工厂模式

文章目录 前言一、引入二、简单工厂模式1.实现2.优缺点3.扩展 三、工厂方法模式1.实现2.优缺点 四、抽象工厂模式1.实现2.优缺点3.使用场景 五、模式扩展六、JDK源码解析总结 前言 软件设计模式之工厂模式。 一、引入 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类…

java八股jvm

JVM虚拟机篇-01-JVM介绍、运行流程_哔哩哔哩_bilibili 1.PC程序计数器 2.堆 3.虚拟机栈 4.方法区/永久代/元空间 5.直接内存 JVM虚拟机篇-06-JVM组成-你听过直接内存吗_哔哩哔哩_bilibili 6.双亲委派 从下往上找&#xff0c;有同名类优先使用上级加载器的&#xff0c;不用自…