SpringMVC

简介: MVC

一、SpringMVC简介
1、Servlet的缺点

1)使用Servlet进行开发,通常情况下,一个Servlet类处理一个请求,如果一个项目有成百上千个请求需要处理,就需要创建成百上千个Servlet来处理这些请求,Servlet类的个数暴增。
2)在Servlet2.5及2.5之前的版本中,每一个Servlet需要在web.xml文件中至少8行以上的配置,在团队开发时,配置信息太多,也容易出现问题
3)Servlet中通过request获取请求参数,无论传过来的是什么值,接收时一律按照字符串进行接收,如果这个值是数值或者日期类型的值,后期还需要强制转换。

request.getParameter(String paramName)            String
request.getParameterValues(String paramName)    String[]

4)Servlet需要依赖于服务器运行,不能进行单元测试。
。。。
2、SpringMVC介绍

SpringMVC是Spring框架中的一个模块,是针对表现层提出来相应的解决方案
SpringMVC是基于MVC设计模式的表现层框架。它没有完全替换Servlet,底层也是通过Servlet来实现。

DispatcherServlet:前端控制器,用于接收分发请求给各个组件,由各个组件对请求进行处理,最后将处理的结果响应给浏览器。
DispatcherServlet需要在web.xml文件中进行配置。

===============================================
二、SpringMVC的入门案例
√ 1、创建工程、导入jar包、创建配置文件

1)CGB-SPRINGMVC-01(Maven的Web工程)
2)导入springmvc的jar包(包括spring的jar包)

以及Servlet、jsp的jar包

3)提供src/main/resources/springmvc-config.xml
2、到web.xml文件中配置前端控制器(DispatcherServlet)

1)配置前端控制器servlet-class、url-pattern

配置前端控制器拦截除JSP以外的所有请求。

2)配置springmvc核心配置文件的位置

<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc-config.xml</param-value>
</init-param>

3、创建 /WEB-INF/pages/home.jsp文件

/WEB-INF/pages/test.jsp文件
4、创建一个Controller(HelloController)

com.tedu.controller.HelloController
5、配置springmvc的核心配置文件
6、编写HelloController类,完成需求,并运行测试!


@Controller
@RequestMapping("/HelloController")
public class HelloController {

@RequestMapping("/hello")
public String testHello() {
    return "xxx";
}

}

localhost:8080/CGB-SPRINGMVC-01/hw/hello

@Controller
public class HelloController {

@RequestMapping("/hello")
public String testHello() {
    return "xxx";
}

}

localhost:8080/CGB-SPRINGMVC-01/hello

三、SpringMVC参数绑定
1、简单类型参数绑定---------------------------------
1.1.需求:

浏览器请求:localhost:8080/CGB-SPRINGMVC-01/testParam1?name=张飞&age=20&addr=北京
获取请求中的name、age、addr参数的值
/* 1.简单类型参数绑定

  • 浏览器请求: /testParam1?name=张飞&age=20&addr=北京
  • 获取请求中携带的name、age、addr参数的值

*/
@RequestMapping("/testParam1")
public String testParam1( String name,Integer age,String addr ) {

System.out.println( "name="+name );
System.out.println( "age="+age );
System.out.println( "addr="+addr );
return "home";

}
总结:这种接收请求参数的方式要求:(1)方法上形参的类型要和请求参数值的类型保持一致;
(2)方法上形参的名字要和请求参数名保持一致;
2、包装类型参数绑定---------------------------------

浏览器请求:localhost:8080/CGB-SPRINGMVC-01/testParam2?name=刘备&age=22&addr=河北
获取请求中的name、age、addr参数的值

声明一个User类,在User类中声明name、age、addr属性,并提供对应的set和get方法
/* 3.包装类型参数绑定

  • 浏览器请求:/testParam2?name=刘备&age=22&addr=河北
  • 获取请求中的name、age、addr参数的值
  • 声明一个User类,在User类中声明name、age、addr属性,并提供对应的set和get方法

*/
@RequestMapping("/testParam2")
public String testParam2( User user ) {

System.out.println( "name="+user.getName() );
System.out.println( "age="+user.getAge() );
System.out.println( "addr="+user.getAddr() );
return "home";

}
总结:这种接收请求参数的方式要求:在包装类型中的属性名和请求参数的名字保持一致(底层是调用包装类型的setXxx方法为xxx属性赋值,而赋的值来自于请求参数中名称为xxx参数的值)
3、日期类型参数绑定---------------------------------

浏览器请求:localhost:8080/CGB-SPRINGMVC-01/testParam3?birthday=2020-2-8 15:13:41
获取请求中的date参数的值
/* 4.日期类型的参数绑定

  • 浏览器请求:/testParam4?date=2020-3-3 15:36:08
  • 获取请求中的date参数的值
  • HTTP Status 400 – Bad Request: 请求参数类型不匹配
  • 因为springmvc框架底层默认的时间格式是以斜杠(/)分隔,例如:
  • /testParam3?birthday=2020/3/3 15:36:08
  • 因此,解决方式一:将浏览器发送的日期格式改为斜杠分隔
  • 解决方式二:将springmvc框架底层默认以斜杠分隔时间改为用横杠分隔
  • 注意:改为横杠分隔后,斜杠分隔的时间在服务器端将无法接收

*/
@RequestMapping("/testParam4")
public String testParam4( Date date ) {

System.out.println( "date="+date );
return "home";

}
/ 自定义日期转换格式:将springmvc框架底层默认以斜杠分隔时间改为用横杠分隔 /
@InitBinder
public void InitBinder (ServletRequestDataBinder binder){

binder.registerCustomEditor(java.util.Date.class, 
    new CustomDateEditor(
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true)
);

}
三、SpringMVC的跳转和乱码处理
1、请求转发

/* 5.测试spring的请求转发

  • 需求:从 /testForward 转发到 /hello
  • 浏览器请求 /testForward --转发(地址不变)--> /hello
  • /hello对应的方法 --转发(地址不变)--> home.jsp

*/
@RequestMapping("/testForward")
public String testForward() {

System.out.println( "testForward方法执行了...." );
return "forward:/hello";

}
请求转发总结:转发只能是同一个应用内部的资源之间进行跳转:
(1)从Controller中的一个方法转发到另外一个方法:

return "forward:/方法上的映射路径";

(2)从Controller中的方法转发JSP:

return "JSP的名字";

2、重定向

/* 5.测试spring的重定向

  • 需求:从 /testRedirect 重定向到 /hello
  • 浏览器请求 /testRedirect --重定向(地址会变)--> /hello
  • /hello对应的方法 --转发(地址不变)--> home.jsp

*/
@RequestMapping("/testRedirect")
public String testRedirect() {

System.out.println( "testRedirect方法执行了...." );
//return "redirect:/hello";
return "redirect:http://www.baidu.com";

}
重定向总结:重定向在跳转时,没有限制
(1)同一个应用中的controller方法跳转到另外一个方法:

return "redirect:/方法上的映射路径";

(2)不同的两个Web应用之间的资源跳转: 从controller方法跳转到/day11/test.jsp

return "redirect:http://localhost/day11/test.jsp";

(3)不同的服务器之间的资源跳转:从controller方法跳转到百度

return "redirect:http://www.baidu.com";

3、乱码处理

Servlet中:
(1)如果是GET提交、并且tomcat为8.0以后的版本,tomcat底层已经处理了GET提交的中文乱码问题,所以GET提交在tomcat8.0以后的版本中没有乱码!
(2)如果是POST提交,无论是哪个版本的tomcat服务器,获取中文参数时都会有乱码问题,如何解决?

request.setCharacterEncoding("utf-8");

springmvc中提供了处理POST提交中文参数乱码方法:在web.xml文件中配置一个乱码处理过滤器。过滤器的配置如下:

<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
    <param-name>encoding</param-name>
    <param-value>UTF8</param-value>
</init-param>


<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>

四、SpringMVC响应数据
1、Model的使用

从Servlet带数据到JSP:(通过request域带数据)

request.setAttribute("xx", xxx);
request.getRequestDispatcher("xxx").forward(req,res);

从Controller带数据到JSP:(通过Model带数据)

model.addAttribute("xx", xxx);
return "xxx";

如果需要从Controller带数据到JSP,可以在Controller的方法上声明一个Model对象
Model其实底层就是request域,可以将数据存入到Model域中,再通过转发将数据带到JSP,
在JSP中取出数据进行显示!

目录
相关文章
|
9月前
|
人工智能 算法 网络协议
2026大预测:人人都是“AI Agent指挥官”的时代真的来了
2026年,AI迈入“智能体时代”:AI Agent具备感知、决策、执行与反思能力,成为人类的“数字化分身”。普通人化身“AI指挥官”,依托动作预测、MCP/A2A协议、长程记忆三大基石,跨平台调度Agent军团完成复杂任务。人机关系升维为“战略指挥”,核心价值转向拆解力、审美判断与伦理风控。(239字)
831 4
|
9月前
|
算法 C++
PPO vs DPO:不是谁淘汰谁,而是你用错了位置
PPO与DPO并非替代关系,而是解决不同问题的工具:PPO适合行为对齐与动态探索,DPO擅长偏好学习与精细优化。选择应基于业务阶段,而非盲目跟风。
|
网络虚拟化 网络架构 智能硬件
动态IP/静态IP
动态IP和静态IP简介:动态IP由ISP通过DHCP自动分配,不固定且无需手动设置,具有较高安全性和成本优势,但不适合对外服务;静态IP地址固定不变,适合需要长期稳定连接的设备,便于远程访问和管理,但安全性较低、成本较高且可能造成资源浪费。两者分别适用于不同场景,如临时设备使用动态IP,服务器及企业网络设备使用静态IP。
2320 13
|
10月前
|
搜索推荐 数据处理 UED
1688新品上架没流量?这套“打标爬升”法则,让你的产品快速被看见的实用指南!
本文详解1688新品运营策略,通过“新品标签快速形成”与“四阶段数据爬升”,助力店铺实现新品快速曝光与转化。涵盖精准选品、老客破零、四阶段执行计划及成长积分规则,全面提升新品竞争力。
|
10月前
|
弹性计算 运维 监控
资源闲置“杀手”:利用费用中心与云监控定时清理僵尸资源
在云计算时代,企业常因“僵尸资源”造成高达30%的云成本浪费。本文教你如何借助阿里云费用中心与云监控,精准识别闲置ECS、EIP、云盘等资源,结合运维编排OOS实现自动化清理,构建从发现到处置的闭环体系,推动云成本从被动支付转向主动治理,全面提升资源利用率与财务效能。(238字)
|
10月前
|
边缘计算 监控 网络协议
网络延迟优化方案
本文系统阐述网络延迟优化全方案,涵盖架构设计、协议调优、全球加速等十大维度,结合实战案例与最佳实践,助力构建低延迟、高稳定网络体系。
1516 0
|
11月前
|
存储 编解码 JSON
PowerToys微软最强工具箱软件集!好用的Windows增强工具箱,降低内存和存储占用
Microsoft PowerToys是微软官方推出的免费开源工具集,专为Win10/11设计,集成20+实用功能,如高级粘贴、颜色拾取、窗口布局管理(FancyZones)、文本提取、屏幕缩放标注等,全面提升办公效率,支持开发者、设计师等高效操作,模块化自由配置,堪称Windows效率神器。
1248 7
|
人工智能
替代你的不是AI,而是会使用AI的人——生成式人工智能(GAI)认证成为职场新宠
在AI技术飞速发展的数字化时代,职场环境正经历深刻变革。生成式人工智能(GAI)认证的出现,为职场人士提供了提升自我、证明能力的新途径。由培生推出的GAI认证,涵盖核心技能与伦理知识,助力求职者脱颖而出。它不仅是职场晋升的加速器,还为企业认可的专业能力背书。拥抱AI、学习AI,通过GAI认证,让自己成为掌握AI技术的领先者,在竞争中保持优势。
|
网络协议 算法 Java
Netty基础—3.基础网络协议
本文详细梳理了计算机网络的基础知识,涵盖从物理层到应用层的各层协议及其功能。内容包括七层模型与四层模型对比、IP地址与子网划分、TCP三次握手及四次挥手过程、Socket编程原理、HTTP/HTTPS协议的工作机制等。同时深入探讨了Linux IO模型(阻塞、非阻塞、IO多路复用)及其应用场景,并分析了select、poll、epoll的区别。此外,还涉及Java IO读写的底层流程及同步异步、阻塞非阻塞的概念。这些知识点为理解网络通信和高性能服务器开发提供了全面的理论支持。
|
Kubernetes 安全 数据安全/隐私保护
容器云服务是什么?
容器云基于容器技术,实现应用及其依赖的标准化封装,支持跨平台快速部署和高效管理。与传统虚拟机相比,容器共享宿主机操作系统内核,资源占用少、启动快,但隔离性稍弱。Docker Engine通过Dockerfile定义应用环境并生成容器镜像,适合单机场景;Kubernetes作为行业标准编排工具,支持自动扩缩容和服务发现,适用于大规模集群管理;OpenShift提供企业级全流程平台,满足合规要求;Rancher简化多云环境下的Kubernetes管理;CoreOS Tectonic专注于安全性,适用于高安全需求领域。容器云正朝着无服务器化、智能运维和边缘协同等方向发展。
1166 1