springMVC
互联网服务架构
- CS架构定义:客户端-服务器架构,需安装客户端软件
- BS架构定义:浏览器-服务器架构,通过浏览器访问
CS架构
CS架构定义:客户端-服务器架构,全称Client Server。CS架构组成:客户端(用户电脑运行程序)和服务器端(数据库服务器或socket服务器)。CS架构示例:QQ应用采用CS架构。服务器类型:数据库服务器(通过数据库连接)和socket服务器(通过socket通信)
优点
- 界面丰富性:CS架构可提供更丰富的用户界面
- 安全性优势:支持多层认证机制,安全性更高
- 交互效率:单层交互设计带来更快的响应速度
- 传输协议:TCP协议比HTTP更高效(握手一次持续连接)
- 本地执行:原生代码直接在客户端运行,无需远程加载
- 性能优势:本地执行带来更快的运行速度和流畅度
- 游戏应用:客户端安装模式比网页游戏性能更优
- 协议比较:TCP报文比HTTP更短,传输效率更高
缺点
- 用户限制:仅适用于局域网固定用户群体
- 安装要求:必须安装客户端程序才能使用
- 维护成本:每次升级需更新所有客户端
- 移动性差:不适用于位置不确定的用户
- 对比优势:BS架构(浏览器/服务器)无需安装升级
BS架构
优点
- 无需安装:后端无需安装,只需浏览器即可访问。
- 广域网访问:系统部署在广域网上,可通过网络多人同时访问。
- 无需升级:系统无需客户端升级,维护简便。
缺点
- 性能局限:BS架构难以达到CS架构的程序表现水平
- 开发成本:实现相近功能需投入更多开发精力
- 速度缺陷:响应速度始终落后于原生客户端应用
- 安全成本:需要额外投入保障系统安全性
- 交互模式:传统BS采用请求-响应机制导致页面刷新
- 技术演进:AJAX技术实现局部刷新但仍有性能差距
- 历史对比:早期BS需整页刷新,AJAX后支持局部更新
B/S发展
早期形式:静态页面
- 静态页面特点:内容固定、无交互性
- 静态页面访问方式:通过服务器地址直接访问
- 静态页面局限性:无法实现动态内容展示
Servlet
SUN 公司刚刚推出avaEE(Java企业版)时,推出了Servlet 这个东西,命名就是Service+Applet,即服务小程序。Servlet可以说是Java技术中最早的Web解决方案,Servlet与普通Java类的编写非常类似。在Servlet中可以通过挨着行输出Html等语句来实现页面的样式和输出,数据的动态功能当然也就实现了。表现、逻辑、控制、业务全部混在Servlet类中。
JSP
- JSP定义:采用HTML语言直接生成界面
- JSP特性:可在HTML中嵌入JAVA代码
- JSP本质:最终会被编译成Servlet类
- JSP优势:适合开发大量动态网页
- JSP语法:通过<% %>标签嵌入JAVA代码
Servlet+JSP+JavaBean
在这种开发模式下,JSP页面中就可以不用任何的<>语句了,包括<%=%>全部用EL表达式来代替,列表的遍历和条件判断等(Java中的for循环和if语句)也可以通过JSTL来代替。这样的话视图层相比较之前的开发模式来说要薄得多的多,JSP中不涉及任何的业务逻辑,前端人员修改样式也十分方便。这里可以理解为JSP为MVC 设计模式中的V即视图。
控制层通过Servlet来实现,获取前台传的参数、控制页面跳转,封装对象、向前台传输对象或者参数。并且可以由自己设计,设法用一个Servlet类实现该模块的所有功能的页面跳转。这里可以理解为Servlet为MVC设计模式中的C,即控制器。
将JavaBean中的封装业务功能再一次进行分割:业务逻辑、数据持久化。
JavaWeb经典三层架构
三层架构:
- 表现层(Web层):通俗说就是用户所能看到的直观的界面。其作用就是接收用户提交的请求数据,以及将程序对用户请求所产生的响应数据反馈给用户。目的就是为用户提供可交互的操作界面。所以,表现层就像已经搭好的积木。
- 业务逻辑层:简单讲就是“具体问题,具体分析”。它根据用户的不同请求而做出不同响应的处理。可以说是对数据层的一种整合方式。所以,就如同每个人会根据自己的喜好搭建不同的积木一样,业务逻辑层代表的就是搭积木的方式。
- 数据访问层(持久化):它只是提供对数据库操作的多种途径。不同的数据就好比形状各异的积木,而数据访问层就好比取出或放回这些积木的动作。
MVC设计模式:
- 模型(Model):封装的是数据源和所有基于对这些数据的操作。在一个组件中,Model往往表示组件的状态和操作状态的方法。
- 视图(View)封装的是对数据源Model的一种显示。一个模型可以由多个视图,而一个视图理论上也可以与不同的模型关联起来。
- 控制器(Control):封装的是外界作用于模型的操作。通常,这些操作会转发到模型上,并调用模型中相应的一个或者多个方法。一般Controller在Model和View之间起到了沟通的作用,处理用户在View上的输入,并转发给Model。这样Model和View两者之间可以做到松散耦合,甚至可以彼此不知道对方,而由Controller连接起这两个部分。
至此,页面的表现由jsp实现,转发控制由servlet实现,业务逻辑写在业务逻辑层,操作数据库部分写在持久化层,封装数据放在bean层,分工明确,各司其职。Model1、Model2、三层是在解耦的基础上一步步进化而来,通过解耦我们可以进行进一步的抽象,以应对现实需求的变动。这里要说的就是,从servlet一直到三层架构的转变,其实都是为了实现高内聚,低耦合。一步一步将各个功能分配到不同的地方实现。
idea新建servlet项目([IDEA 2024.3.4版本配置servlet方法_idea配置servlet-CSDN博客]:)
框架实现原理
因为servlert在tomacat服务器中,不能被管理,所以写一个Dispatch 类来分发servlert请求,比如Dispatch 类里包含login请求和register请求,现在我们就可以实现这loginCompnent和registerCompnent来执行原理servlert的功能,而Dispatch和这些Compnent可以被加载成bean,所以就完成了框架管理,可以用@Autowier来自动注入。这样我们就完成了sevlet的管理,这也是cotroller,数据持久层也可以用这样的方式被框架管理。
spring stract2 Hidder =ssH
spring springMVC Mybites = ssm
springboot = spring+springMVC
SpringMVC
SpringMVC是Spring 框架的一个模块,SpringMVC和 Spring 无需通过中间整合层进行整合。SpringMVC是一个基于MVC 的 web 框架,即 Spring Web MVC。Spring Web MVC 和 Struts2 都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:

WebMVC原理
首先来一下MVC,MVC是一种设计模式,在大量的软件开发过程中所积累出来的经验,然后根据经验抽象出来的一种开发模式。下面来看一下MVC设计模式B/S架构的系统下的应用:

SpringMVC框架原理
从上图中看到MVC的基本框架后,那么下面学习SpringMVC框架就有了一个大体的思路。因为SpringMVC就是MVC模型的一种框架。所以学习SpringMVC框架主要就是来看SpringMVC中的C(控制层)、M(模型层)、V(视图层)的各种技术实现即可。如下图所示:

前端把request请求发送到前端控制器DispatcherServlet,DispatcherServlet根据url查找响应的处理模型handler,这其中先经过处理器映射器HandMapping来找到对应的处理器适配器HandlerAdapter,HandlerAdapter去执行handler,handler处理器controller执行后,结果再通过处理器适配器返回给DispatcherServlet,DispatcherServlet再将结果通过response请求发送给前端。
使用
pom依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
web.xml文件中
<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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
springmvc.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"
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">
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
</beans>
再配置cotroller
注解的SpringMvc
配置扫描
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<context:component-scan base-package="com.origin.controller"></context:component-scan>
配置controller
@Controller
public class LoginController {
@RequestMapping("/login.action")
public String handleRequest( String username, String password, HttpSession session, Model model) {
if ("zhangsan".equals(username) && "1234".equals(password)) {
session.setAttribute("username", username);
return "redirect:/order.jsp";
} else {
model.addAttribute("error", "用户名或密码错误");
return "order.jsp";
}
}
}
@Controller+@RequestBody=@RestController
