javaweb 下篇

JavaWeb核心技术总结:HTTP协议、域对象、转发重定向与注解配置

一、HTTP协议:请求与响应报文格式

HTTP是客户端与服务器间数据传输的标准协议,核心在于报文格式

  • 请求报文(4部分)

    1. 请求行:包含请求方法(GET/POST等)、URI、协议版本(如 GET /api/user HTTP/1.1)。
    2. 请求头:传递客户端信息(如 User-AgentCookie)、数据类型(Content-Type)等。
    3. 空白行:分隔请求头与请求体(GET无请求体,POST有)。
    4. 请求体:存放提交的数据(如表单数据 name=value&name=value)。
  • 响应报文(4部分)

    1. 状态行:协议版本、状态码(如 200 OK404 Not Found)。
    2. 响应头:传递服务器信息(Server)、响应数据类型(Content-Type)等。
    3. 空白行:分隔响应头与响应体。
    4. 响应体:实际返回的数据(HTML、JSON等)。

二、域对象:数据共享的作用范围

JavaWeb中三大域对象用于不同范围的数据共享,均支持 setAttribute/getAttribute/removeAttribute 方法:

域对象 对应类名 作用范围 特点 使用原则
请求域 HttpServletRequest 请求级别(一次请求内) 仅在当前请求中有效,请求结束后数据销毁(如转发时传递临时数据)。 优先使用,数据量小、临时数据。
会话域 HttpSession 会话级别(用户浏览器) 基于Cookie或URL重写,跨请求共享用户数据(如登录状态、购物车)。 用户级数据共享。
应用域 ServletContext 应用级别(整个项目) 所有用户共享,生命周期与项目一致(启动创建,停止销毁)。 全局只读数据(如配置项)。

大小关系request < session < application原则:能用小域(请求域)就不用大域,减少内存占用和线程安全问题。

三、转发 vs 重定向:数据传递与跳转逻辑

特性转发(Forward)重定向(Redirect)
实现方式 服务器内部跳转(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高级特性)

  1. 过滤器(Filter)

    • 作用:预处理请求(如编码处理、权限校验)或后处理响应(如添加响应头)。
    • 核心方法doFilter(处理逻辑)、init(初始化)、destroy(销毁)。
    • 示例:字符编码过滤器(统一设置request.setCharacterEncoding("UTF-8"))。
  2. 监听器(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 应用开发中。

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-11-25 09:53
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务