WEB开发——Servlet(Servlet、ServletRequest/Response、HttpServletRequest、转发与重定向、HttpServlet)

本文介绍了JavaWeb应用的基本概念,包括Servlet、ServletRequest/Response、HttpServletRequest以及Servlet容器如Tomcat的角色。讲解了Servlet的功能,作为动态Web内容生成器,并强调了Servlet的单实例性质可能带来的安全问题。此外,还探讨了web.xml中Servlet的注册方法,以及ServletRequest和ServletResponse接口在处理HTTP请求和响应中的作用。特别提到了请求转发和重定向的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaWeb应用的概念:
由一组Servlet、HTML页面、类、以及其它可以被绑定的资源构成。可以在供应商提供的实现Servlet规范的Servlet容器中运行。应用中可以包含:Servlet、JSP、实用类、静态文档(HTML、图片等)、描述Web应用的信息(web.xml)
------------------------------------------------------------------------------------------------------------------
Servlet容器的概念:
●  为JavaWeb应用提供运行时的环境,负责管理Servlet和JSP的生命周期,以及管理它们的共享数据
●  也称为JavaWeb应用容器,或者Servlet/JSP容器
●  流行的Servlet容器软件:Tomcat、Resin、J2EE服务器(如Weblogic)中也提供了内置的Servlet容器
------------------------------------------------------------------------------------------------------------------
Tomcat目录结构:(Tomcat是一个免费的开放源代码的Servlet容器)

------------------------------------------------------------------------------------------------------------------
Tomcat的端口号:(打开conf目录下的server.xml文件)

------------------------------------------------------------------------------------------------------------------
Web工程目录结构:

------------------------------------------------------------------------------------------------------------------
Servlet简介:Server Applet,是Java Servlet的简称)
●  称为小服务程序或服务连接器,主要功能在于交互式地浏览和修改数据,生成动态Web内容
●  与平台无关的服务器端组件,运行在Servlet容器中
●  Servlet是单实例的,可能存在安全问题

注意:Servlet容器负责Servlet和客户的通信(采用“请求/响应”的模式)以及调用Servlet的方法
------------------------------------------------------------------------------------------------------------------
Servlet的注册:

实现Servlet接口:

web.xm中注册Servlet:

注解:@WebServlet(name=注册名, urlPatterns={ 访问路径 }),简写@WebServlet(访问路径)

注意:注册到serlvet容器中的一个servlet可以被多个地址映射。在使用注解时,多个地址映射用花括号括起来,路径与路径使用逗号隔开。load-on-startup标签配置在servlet节点中,表示该Servlet被创建的时机,值越小越早被构建对象,如果为负数,则在第一次访问时被构建对象
------------------------------------------------------------------------------------------------------------------
Servlet的生命周期:
●  默认是在第一次访问这个servlet时构建他的对象(调用构造器)
●  紧接着马上调用init方法,用于初始化servlet
●  请求时始终调用service方法,这个service方法是处理请求和响应的方法
●  当Web服务器被停止服务时,servlet被销毁了,调用的是destroy方法
注意:servlet的生命周期相关的方法都是由Web服务器调用的
------------------------------------------------------------------------------------------------------------------
请求与相应:

------------------------------------------------------------------------------------------------------------------
出现乱码解决方式:
●  修改当前工程所有文件的字符集编码为UTF-8,及整个工程为UTF-8
●  修改ServletRequest对象接收的字符集编码为UTF-8
●  修改ServletResponse对象输出的字符集编码为UTF-8
●  修改web容器的配置文件字符集编码为UTF-8( URIEncoding="UTF-8",加在端口号内)
注意:text/html表示为输出的方式
------------------------------------------------------------------------------------------------------------------
ServletConfig接口:(存放的是当前servlet在web.xml配置的初始化信息)

web.xml文件的servlet中配置:


方法:
●  getInitParameter(Stirng  s):获得当前servlet配置下指定参数名的参数值

●  getInitParameterNames( ):获得当前servlet配置下所有参数名(类似于下面的getParameterNames()方法)

●  getServletName( ):获得当前servlet注册到web容器的名字
●  getServletContext( ):获得当前web工程的上下文 (相关信息)
------------------------------------------------------------------------------------------------------------------
ServletContext接口:(存放的是和当前工程相关的信息)
功能:
●  获取WEB应用程序的初始化参数 
●  记录日志 
●  application域范围的属性 
●  访问资源文件 
●  获取虚拟路径所映射的本地路径 
●  WEB应用程序之间的访问 
方法:
●  getInitParameter(String  s):获得当前web工程配置下指定参数名的参数值
●  getInitParameterNames( ):获得当前web工程配置下所有参数名(类似于下面的getParameterNames()方法)
●  getContextPath( ):获得当前工程的名字
●  getRealPath(String  path):获取当前WEB应用的某一个文件在服务器上的绝对路径(不是部署前的路径)
●  getResourceAsStream(String  s):读取外部署后的文件,把他转换成输入流( / 为当前WEB应用的根目录)

web.xml文件的根元素<web-app>中配置:


------------------------------------------------------------------------------------------------------------------
get请求和post请求:
什么是get请求:(get方式传送的数据量一般限制在1KB以下)
●  在浏览器中输入某个URL地址或单击网页上的一个超链接时,发出的HTTP请求方式
●  网页中的form表单元素的method属性被设置为了“get”,浏览器提交这个表单时生成的HTTP请求方式
●  传递参数的格式:http://www.baidu.com/counter.jsp?name=123&password=123
什么是post请求:
●  网页中的form表单元素的method属性被设置为了“post”,浏览器提交这个表单时生成的HTTP请求方式
●  将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比GET大得多
------------------------------------------------------------------------------------------------------------------
ServletRequest:(封装了请求信息,可以从中获取到任何的请求信息)
●  getParameter(String  name):根据请求参数名,获得参数值
●  getParameterValues(String  name):根据请求参数的名字,返回请求参数对应的字符串数组

●  getParameterNames( ):返回所有参数名(古老的一种迭代器)

●  getParameterMap( ):返回请求参数的Map集合键值对(key: 参数名,  value: 参数值, String数组类型)


注意:getParameter( )方法只能获得单个值,像checkbox提交的多个值,,只能获取到第一个提交的值
------------------------------------------------------------------------------------------------------------------
HttpServletRequest:(是ServletRequest的子接口,使用时需强转)
●  getRequestURI( ):获取请求的url
●  getMethod():获取请求方式
●  getQueryString( ):若是一个get请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串

●  getServletPath( ):获取请求的Serlvet的映射路径 

注意:ServletRequest接口类用于封装请求消息,HttpServletRequest是专用于HTTP协议的ServletRequest子接口,它用于封装HTTP请求消息

------------------------------------------------------------------------------------------------------------------
ServletResponse:(封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现)
●  getWriter( ):返回PrintWriter对象,调用该对象的print( )方法, 把参数直接打印到浏览器上

●  setContentType("application/msword"):设置响应的内容类型

注意:此接口类用于创建响应消息,HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息

------------------------------------------------------------------------------------------------------------------

请求域属性:存储在ServletRequest对象中的对象称之为请求域属性
●  setAttribute(String  s ,Object  o):向request中添加一个属性,以键值对的方式存储起来
●  getAttribute(String  s ):获取request中的属性
注意:属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据

------------------------------------------------------------------------------------------------------------------

请求的转发和重定向:本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求

方法:

●  getRequestDispatcher(String  location): 请求的转发

●  forward(request,response):转发时携带的参数

●  sendRedirect(String  location):请求的重定向

转发:

●  /表示的是当前WEB应用
●  地址栏的地址不会改变
●  多次转发是一次请求
●  只能在当前web应用中转发
重定向:
●  /表示的是当前WEB容器
●  地址栏会发生变化
●  多次转发是多次请求
●  可以访问到当前web应用之外的资源

------------------------------------------------------------------------------------------------------------------
HttpServlet:好处:直接使用HttpServletRequest和HttpServletResponse对象。不再需要强转

注意:在实际开发中, 我们大多使用HttpServlet,重写doXxx()方法,方法中写请求与响应,请求方式不明时,在方法内互调方法来执行(GenericServlet是Servlet接口和ServletConfig接口的实现类。如果新建的Servlet程序直接继承GenericSerlvet会使开发更简洁,HttpServlet是GenericServlet的子类,针对于HTTP协议所定制(在GenericServlet实现并重写这两个接口的方法service()中把ServletReuqest和ServletResponse转为了HttpServletRequest和HttpServletResponse))
------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知
<think>好的,我现在需要帮助用户理解他们提供的Java代码中的类型转换部分,即从`ServletRequest`和`ServletResponse`转换为`HttpServletRequest`和`HttpServletResponse`。首先,我应该回顾一下Java Servlet的基础知识,确保自己对这些接口和类型转换的原因有正确的理解。 用户的问题是关于为什么需要进行这样的类型转换,以及这个转换涉及到的协议类型。我记得Servlet规范中,`ServletRequest`和`ServletResponse`是通用的接口,而它们的子接口`HttpServletRequest`和`HttpServletResponse`是针对HTTP协议的具体实现。所以,当处理HTTP请求时,通常需要访问特定于HTTP的方法,比如获取HTTP头信息或设置Cookie,这时候就必须使用HttpServlet版本。 接下来,我需要考虑用户可能的背景。他们可能正在学习Servlet开发,或者在维护旧代码时遇到这种情况。他们可能不理解为什么需要强制转换,或者不确定这种转换是否安全。因此,解释类型转换的必要性、安全性以及应用场景是关键。 我应该分步骤来解释这个过程。首先,说明Servlet API的设计,通用接口HTTP特定接口的关系。然后,讨论类型转换的原因,比如访问HTTP特有的方法。同时,需要提到在Servlet容器(如Tomcat)处理请求时,传递的实际上是HttpServlet对象,因此转换是安全的,前提是确保请求确实基于HTTP协议。 可能还需要指出,在非HTTP协议的情况下(比如FTP),这种转换会失败,但实际中几乎所有的Servlet都是用于HTTP的。因此,这种转换在大多数情况下是安全的,但也要注意异常处理,比如ClassCastException,虽然这种情况很少发生。 另外,用户可能想知道如何正确使用转换后的对象,比如调用`getHeader()`或`sendRedirect()`等方法,这些在通用接口中不存在。可以举一些具体的例子,说明转换后的对象能做什么,而转换前不能。 最后,总结这种类型转换的意义,强调它在访问特定协议功能时的必要性,以及在Servlet开发中的普遍应用。确保语言通俗易懂,结构清晰,帮助用户逐步理解整个过程。</think>在Java Web开发中,`HttpServletRequest`和`HttpServletResponse`的类型转换涉及Servlet规范的核心设计,我们分步骤解释: 一、**Servlet API层级结构** 1. 通用接口:`ServletRequest`和`ServletResponse`是基础接口,定义请求/响应的通用方法如: - `getInputStream()` - `getWriter()` - `setContentType()` 2. HTTP专用接口:`HttpServletRequest`和`HttpServletResponse`继承自前者,添加HTTP协议特有方法: ```java // HTTP特有方法示例 String getHeader(String name); // 获取请求头 void sendRedirect(String location); // 发送重定向 Cookie[] getCookies(); // 获取Cookies ``` 二、**类型转换的本质** ```java HttpServletRequest httpReq = (HttpServletRequest) request; ``` - 这里进行的是向下转型(Downcasting) - 安全性保障:Servlet容器(如Tomcat)处理HTTP请求时,实际创建的request对象是`HttpServletRequest`的实现类(如`org.apache.catalina.connector.RequestFacade`) - 设计模式体现:这是典型的**门面模式(Facade Pattern)**,容器隐藏底层实现细节 三、**应用场景分析** 1. 需要访问HTTP协议特有功能时: ```java // 获取HTTP请求方法 String method = httpReq.getMethod(); // 设置HTTP状态码 httpResp.setStatus(404); ``` 2. 使用会话管理: ```java HttpSession session = httpReq.getSession(); ``` 3. Cookie操作: ```java httpResp.addCookie(new Cookie("user","admin")); ``` 四、**注意事项** 1. **协议保证**:该转换仅在处理HTTP请求时有效,其他协议(如FTP)的Servlet实现理论上可能不同,但实际中Servlet规范主要面向HTTP 2. **异常处理**:虽然实际开发中极少出现,理论上应添加类型检查: ```java if(request instanceof HttpServletRequest) { // 安全转换 } ``` 五、**底层实现示例** Tomcat容器创建请求对象的过程: 1. 接收HTTP请求字节流 2. 解析生成`org.apache.coyote.Request`对象 3. 通过适配器模式生成`HttpServletRequest`门面对象 六、**设计意义** 1. 扩展性:保留支持非HTTP协议的可能性 2. 接口隔离:普通Servlet只需关注通用方法 3. 协议特化:HTTP相关的Servlet获得完整协议支持 总结:这种类型转换是Java Web开发中的标准做法,通过访问HTTP专用接口实现完整的Web协议处理能力,是Servlet规范分层设计的典型体现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值