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 应用开发中。

全部评论

相关推荐

投递链接:&nbsp;https://anker-in.jobs.feishu.cn/s/iSA8v9d2校招春招3月3日全面开始,各类岗位HC充足!欢迎点击链接去看岗位。最快半个月即可发放offer!最近安克发布了员工年薪情况,2024年有494人年薪达百万,经营结果分享奖金超过8亿,欢迎大家投递,毕业三五年后年薪百万不是梦!一、笔试和面试测评:要靠拢公司价值观,可以关注安克微信公众号看看价值观历史文章,也可以去知乎搜搜华为的性格测评怎么作答,都有相似之处。行测题可以多刷一刷,整体不难。测评过不了一票否决,一定要重视并提前准备。性格测评可以参考https://www.nowcoder.com/discuss/353158733318529024,题目形式是把三个陈述按照符合程度排序,注意会有重复或接近的题目,不要前后矛盾。安克的价值观是&ldquo;第一性,求极致,共成长&rdquo;,第一性就是关注底层原理。cata测评言语理解、资料分析、图形推理各10道题,共30道,每道题作答时间60~90秒。难度中等,正常行测难度。笔试:容易到中等难度,多多刷题提前准备即可。面试:一定会问简历上的内容,特别是项目,另外会问重点的专业知识,还会问一些常规的问题,比如遇到困难是怎么解决的,这种都可以提前准备好,例子要具体详细有专业性。二、入职后去年校招集体培训三周,内容丰富,公司花了大力气在校招生上。研发类岗位有不少大厂来的大佬带,研发流程也在日渐规范化。平心而论,研发都不轻松的,毕竟薪酬还是到位的。安克的商业类岗位挺吃香的,海外业务做得风生水起。公司内氛围比较自由,大家都互喊英文名,发色服饰纹身自由。公司有电影、羽毛球、篮球、健身、游泳等活动,参加各种小活动可以领充电宝、耳机等礼品,另外每年发两次tws耳机、音箱等产品。除了五险一金还有商业保险、加班打车等福利。另外,公司有猫可以撸!三、内推链接欢迎大家去看看岗位啊,内推简历会优先筛选的,也可以私信我跟踪进度。投递链接:&nbsp;https://anker-in.jobs.feishu.cn/s/iSA8v9d2
安克创新 Anker
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务