javaweb 下篇
JavaWeb核心技术总结:HTTP协议、域对象、转发重定向与注解配置
一、HTTP协议:请求与响应报文格式
HTTP是客户端与服务器间数据传输的标准协议,核心在于报文格式:
-
请求报文(4部分):
- 请求行:包含请求方法(GET/POST等)、URI、协议版本(如
GET /api/user HTTP/1.1
)。 - 请求头:传递客户端信息(如
User-Agent
、Cookie
)、数据类型(Content-Type
)等。 - 空白行:分隔请求头与请求体(GET无请求体,POST有)。
- 请求体:存放提交的数据(如表单数据
name=value&name=value
)。
- 请求行:包含请求方法(GET/POST等)、URI、协议版本(如
-
响应报文(4部分):
- 状态行:协议版本、状态码(如
200 OK
、404 Not Found
)。 - 响应头:传递服务器信息(
Server
)、响应数据类型(Content-Type
)等。 - 空白行:分隔响应头与响应体。
- 响应体:实际返回的数据(HTML、JSON等)。
- 状态行:协议版本、状态码(如
二、域对象:数据共享的作用范围
JavaWeb中三大域对象用于不同范围的数据共享,均支持 setAttribute
/getAttribute
/removeAttribute
方法:
请求域 | HttpServletRequest |
请求级别(一次请求内) | 仅在当前请求中有效,请求结束后数据销毁(如转发时传递临时数据)。 | 优先使用,数据量小、临时数据。 |
会话域 | HttpSession |
会话级别(用户浏览器) | 基于Cookie或URL重写,跨请求共享用户数据(如登录状态、购物车)。 | 用户级数据共享。 |
应用域 | ServletContext |
应用级别(整个项目) | 所有用户共享,生命周期与项目一致(启动创建,停止销毁)。 | 全局只读数据(如配置项)。 |
大小关系:request < session < application
,原则:能用小域(请求域)就不用大域,减少内存占用和线程安全问题。
三、转发 vs 重定向:数据传递与跳转逻辑
实现方式 | 服务器内部跳转(request.getRequestDispatcher().forward() ) |
服务器返回302状态码,客户端重新发送请求 |
URL变化 | 不变(浏览器地址栏显示原URL) | 改变(显示新URL) |
数据传递 | 支持(通过请求域 request.setAttribute ) |
不支持(需通过URL参数或Session传递) |
性能 | 更高(仅一次网络请求) | 较低(两次网络请求) |
应用场景 | 需传递数据、跳转至内部资源(如登录验证后跳转主页) | 无需数据、强制跳转外部资源(如用户未登录跳转登录页) |
四、静态视图 vs 动态视图:内容生成方式
-
静态视图:
- 特点:内容固定,直接返回给客户端(如HTML、CSS、JS)。
- 示例:
index.html
(纯HTML页面,不包含任何Java代码)。
-
动态视图:
- 特点:根据请求动态生成内容(如嵌入Java代码的JSP、返回JSON的Servlet)。
- 示例:
user.jsp
(通过<%= %>
输出动态数据,或通过Spring MVC返回Model数据)。
五、注解配置:@WebServlet 常用参数
通过注解简化Servlet配置(替代web.xml
),以@WebServlet
为例:
@WebServlet(
name = "helloServlet", // Servlet名称(可选,默认类名)
urlPatterns = {"/hello1", "/hello2"}, // 映射URL(必选,支持多个路径)
loadOnStartup = 1, // 服务器启动时加载(值≥0,越小优先级越高)
initParams = { // 初始化参数(替代web.xml的<init-param>)
@WebInitParam(name = "username", value = "root"),
@WebInitParam(name = "password", value = "123")
}
)
public class HelloServlet extends HttpServlet { ... }
- 核心参数:
urlPatterns
(必填,定义访问路径)、initParams
(可选,传递初始化配置)。
六、扩展:过滤器与监听器(Servlet高级特性)
-
过滤器(Filter):
- 作用:预处理请求(如编码处理、权限校验)或后处理响应(如添加响应头)。
- 核心方法:
doFilter
(处理逻辑)、init
(初始化)、destroy
(销毁)。 - 示例:字符编码过滤器(统一设置
request.setCharacterEncoding("UTF-8")
)。
-
监听器(Listener):
- 作用:监听域对象(request/session/application)的生命周期事件或属性变化。
- 类型:
- 生命周期监听(如
ServletContextListener
监听应用启动/停止)。 - 属性监听(如
ServletRequestAttributeListener
监听请求域属性变化)。
- 生命周期监听(如
七、视图解析器(MVC架构关键组件)
- 作用:将控制器(如Servlet、Spring MVC Controller)返回的逻辑视图名解析为物理路径,返回对应视图给客户端。
- 示例(Spring MVC配置):
控制器返回@Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); // 前缀 resolver.setSuffix(".jsp"); // 后缀 return resolver; }
"user"
,视图解析器会生成/WEB-INF/views/user.jsp
路径。
总结
JavaWeb开发中,理解HTTP协议是数据交互的基础,合理使用域对象实现高效的数据共享,通过转发/重定向控制页面跳转逻辑,利用注解简化配置,并借助过滤器、监听器和视图解析器构建灵活可扩展的Web应用。核心原则:按作用范围选择域对象,按需求选择跳转方式,按场景使用静态/动态视图。
Javaweb 文章被收录于专栏
JavaWeb 是指使用 Java 技术来开发基于 Web 的应用程序,它结合了 Java 语言的强大功能和 Web 技术的灵活性,广泛应用于各种企业级 Web 应用开发中。