B039-SpringMVC基础

目录

      • 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";
	}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音达人筛选需要注意什么,投放总结

商家想要在抖音开拓市场&#xff0c;带动产品销路&#xff0c;寻找达人投放是必行之道。那么抖音达人筛选需要注意什么&#xff0c;我们为大家总结了如下流程。 一、以基础数据找达人 以基础数据进行抖音达人筛选&#xff0c;可以称得上是很直接的方法了。这里的接触数据包括粉…

高集成高能效FAN21SV04MPX 单输入集成同步降压调节器技术解析

FAN21SV04MPX 是一款高效、小型、可编程频率的 4 A 集成同步降压调节器。FAN21SV04MPX 采用经过优化的互联方式将同步MOSFET和控制器/驱动器包含在一个封装中&#xff0c;使得设计人员能够使用最少的外部元件&#xff0c;在较小面积中满足高电流要求&#xff0c;从而降低成本。…

数据安全治理解决方案:PPT全文27页,附下载

关键词&#xff1a;售前方案工程师&#xff0c;解决方案工程师&#xff0c;技术转售前&#xff0c;技术转售前的优势&#xff0c;软件工程师转售前 一、数据安全治理建设的重要性 1、保护商业机密和个人隐私&#xff1a;企业和个人的敏感信息&#xff0c;如财务报表、客户名单…

用CHAT了解各地美食

问CHAT&#xff1a;中国西北菜发源地 CHAT回复&#xff1a;中国西北菜指的是陕西、甘肃、宁夏、青海和新疆五个省份的地方特色菜系。这些地方地理位置特殊&#xff0c;气候条件独具特色&#xff0c;因此形成了各自独特的菜系。 1. 陕西菜&#xff1a;发源于中国的陕西省&#…

win10怎么录制屏幕?教你全方位掌握录屏技巧

屏幕录制是与他人分享操作步骤、游戏精彩瞬间或创建教程的常见需求。随着windows 10系统的普及&#xff0c;越来越多的人开始寻求在win10下录制屏幕的方法。接下来&#xff0c;我们将介绍三种win10怎么录制屏幕的方法&#xff0c;并对每种方法进行分步骤详细介绍&#xff0c;以…

在.NET 应用程序中使用DSN-GBASE南大通用

在.NET 应用程序中使用GBASE南大通用 machine.config 文件中的资源时&#xff0c;首先需在工程中 引用 .NET Framework 的组件GBASE南大通用 System.configuration&#xff0c;然后使用 using 语句将GBASE南大通用System.configuration 命名空间中的类引入到工程中。 1) 在工…

CAS为什么还存在线程安全问题(从所谓的ABA问题再学CAS)

概述 之前学习 CAS&#xff0c;从 Java 代码层面知道其原理&#xff0c;借助一条 CPU 原子指令&#xff0c;通过不断地自旋去比较&#xff08;compare&#xff09;和&#xff08;and&#xff09;赋值&#xff08;set&#xff09;。当时对线程安全的认知停留在将多条 Java 语句…

AI数字人盘活本地生活!

据艾瑞咨询统计&#xff0c;2022年中国本地生活服务市场规模达到3.8万亿元&#xff0c;同比增长23.5%。另据QuestMobile&#xff0c;2023年4月&#xff0c;本地生活综合服务行业全网渗透率38.4%&#xff0c;外卖服务渗透率15.6%。 本地生活市场仍具较大空间&#xff0c;各大平台…

ModStart框架助力博客开发,全新视频教程助你轻松上手!

它来了&#xff01;它来了&#xff01;ModStart框架的博客主题开发视频教程终于上线啦&#xff01;如果你是一名开发者&#xff0c;想要快速搭建一个美观、功能强大的博客网站&#xff0c;那么这个教程将是你的不二之选&#xff01; ModStart是一款基于Laravel的模块化开发框架…

Git版本控制系统:简介、演变与优缺点

目录 前言1 版本控制概述2 集中式版本控制的优缺点2.1 优点2.2 缺点 3 分布式版本控制的优缺点3.1 优点3.2 缺点 4 Git的发展过程结语 前言 在软件开发和团队协作中&#xff0c;版本控制是至关重要的。它允许开发人员跟踪文件的更改历史&#xff0c;协同工作并管理代码的不同版…

MLX vs MPS vs CUDA:苹果新机器学习框架的基准测试

如果你是一个Mac用户和一个深度学习爱好者&#xff0c;你可能希望在某些时候Mac可以处理一些重型模型。苹果刚刚发布了MLX&#xff0c;一个在苹果芯片上高效运行机器学习模型的框架。 最近在PyTorch 1.12中引入MPS后端已经是一个大胆的步骤&#xff0c;但随着MLX的宣布&#x…

神经科学与计算神经科学的蓬勃发展与未来趋势

导言 神经科学和计算神经科学是当前科学研究领域中备受关注的方向。本文将深入研究这两个领域的发展历程、遇到的问题、解决过程&#xff0c;以及未来的可用范围。我们还将关注在各国的应用现状以及未来的研究趋势&#xff0c;探讨如何在竞争中取胜&#xff0c;以及在哪些方面发…

PostgreSQL表中字段由字符串改为数组

需求&#xff1a;PostgreSQL数据库中的一张表的某些字段&#xff0c;之前存的是字符串&#xff0c;由于业务需求变更&#xff0c;需要存储多条数据&#xff0c;字段类型要改为数组&#xff0c;并保留原来的数据。 具体实现&#xff1a; 修改表中字段类型&#xff1a;把 etl_f…

全功能知识付费小程序系统源码是什么?有什么好处?

全功能知识付费小程序系统源码&#xff0c;是一个集课程管理、用户管理、支付管理、数据分析等于一体的综合性解决方案。它支持多种形式的课程内容&#xff0c;如视频、音频、图文等&#xff0c;满足不同用户的学习需求。同时&#xff0c;系统具备完善的支付功能&#xff0c;保…

Panoply查看nc文件的时间维

打开的是全球灌溉农田灌溉用水量遥感估算数据集&#xff08;2011-2018&#xff09;&#xff0c;该文件以nc格式储存。nc格式文件就是一个多维的数据库。经纬度占了两维&#xff0c;可能还有时间维度&#xff0c;就是时空谱。 双击打开刚打开时只能看到2018年1月的灌溉数据 打…

快猫视频模板源码定制开发 苹果CMS 可打包成双端APP

苹果CMS快猫视频网站模板源码&#xff0c;可用于开发双端APP&#xff0c;后台支持自定义参数&#xff0c;包括会员升级页面、视频、演员、专题、收藏和会员系统等完整模块。还可以直接指定某个分类下的视频为免费专区&#xff0c;具备完善的卡密支付体系&#xff0c;无需人工管…

数合建模功能清单

在百度搜索 ”数合建模及可视化“&#xff0c;进入官网网站&#xff0c;有更详细的说明

k8s 中部署Jenkins

创建namespace apiVersion: v1 kind: Namespace metadata:name: jenkins创建pv以及pvc kind: PersistentVolume apiVersion: v1 metadata:name: jenkins-pv-volumenamespace: jenkinslabels:type: localapp: jenkins spec:#storageClassName: manualcapacity:storage: 5Giacc…

mysql部署 --(docker)

先查找MySQL 镜像 Docker search mysql &#xff1b; 拉取mysql镜像&#xff0c;默认拉取最新的&#xff1b; 创建mysql容器&#xff0c;-p 代表端口映射&#xff0c;格式为 宿主机端口&#xff1a;容器运行端口 -e 代表添加环境变量&#xff0c;MYSQL_ROOT_PASSWORD是root用户…

ACE Tools环境配置指导

ACE Tools环境配置指导 简介&#xff1a; ACE Tools是一套为ArkUI-X应用开发者提供的命令行工具&#xff0c;支持在Windows/Ubuntu/macOS平台运行&#xff0c;用于构建OpenHarmony、HarmonyOS、Android和iOS平台的应用程序&#xff0c; 其功能包括开发环境检查&#xff0c;新建…