Servlet(四)——HttpServletRequest对象

1.简介

HttpServletRequest对象:主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomcat封装好传递过来。
HttpServletRequest是ServletRequest的子接口,ServletRequest 只有一个子接口,就是HttpServletRequest。

既然只有一个子接口为什么不将两个接口合并为一个?
从长远上讲:现在主要用的协议是HTTP协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承ServletRequest接口就行了。

在HttpServletRequest接口中,定义的方法很多,但都是围绕接收客户端参数的。但是怎么拿到该对象呢?
不需要,直接在Service方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。

2.接受请求

2.1 常用方法

方法:
请添加图片描述
示例:
请添加图片描述

/*常用方法*/
//获取请求时的完整路径(从http开始,到"?"前面结束)
String url = req.getRequestURL() + "";
System.out.println("获取请求时的完整路径:"+ url);
//获取请求时的部分路径(从项目的站点名开始,到"?"前面结束String uri = request.getRequestURI();
String uri=req.getRequestURI();
System.out.println("获取请求时的部分路径: " + uri);
//获取请求时的参数字符串(从"?"后面开始,到最后的字符串) 
String queryString=req.getQueryString();
System.out.println("获取请求时的参数字符串: " + queryString); 
//获取请求方式(GET和POST)
String method = req.getMethod();
System.out.println("获取请求方式:"+ method)
//获取当前协议版本(HTTP/1.1)
String prototol = req.getProtocol();
System.out.println("获取当前协议版本:"+ prototol);
//获取项目的站点名(项目对外访问路径)
String webapp = req.getContextPath()//上下文路径
System.out.println("" + webapp);

2.2 获取请求参数

方法
请添加图片描述
示例

/* 获取请求的参数 */
// 获取指定名称的参数值,返回字符串(重点!!!)
/* 获取请求的参数 */
// 获取指定名称的参数值,返回字符串(重点!!!)
String uname = req.getParameter("uname"); 
String upwd = req.getParameter( "upwd");
System.out.println("uname:" + uname + ", upwd:" + upwd);

// 获取指定名称的参数的所有参数值, 返回字符串数组织 (用于复选框传值) 
String[] hobbys = req.getParameterValues( "hobby ");
// 判断数组是否为空
if (hobbys != null && hobbys.length>0) {
	for (String hobby : hobbys) {
     	System.out.println("爱好:" + hobby);

 	}
}

3.请求乱码问题

乱码原因:由于在解析过程中默认使用的编码方式为 ISO-8859 -1(此编码不支持中文), 所以解析时一定会出现乱码。

请求乱码问题:
GET请求 Tomcat8以上版本不会乱码
POST请求 任何版本都会乱码,通过设置服务器解析编码的格式

方式一:

 //设置请求的编码格式
req.setCharacterEncoding("UTF-8");//注意设置编码格式一定要放在请求参数前面

这种方式只针对POST有效(必须在接收所有的数据之前设定)

方式二:

String name=new String(req.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");

针对任何请求方式有效,但是如果数据本身不乱码还是new String方法转换,那么就会乱码
借助了String对象的方法,该种方式对任何请求有效,是通用的。Tomcat8起,以后的GET方式请求是不会出现乱码的。

4.请求转发

请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
实现方式如下,达到多个资源协同响应的效果。

// 接收客户端请求的参数
String uname = req.getParameter("uname");
System.out.println("Servlet03 uname :" + uname);

// 请求转发跳转到Servlet04
// request.getRequestDispatcher("s04") forward(request,response); 
// 请求转发跳转到jsp页面
// request.getRequestDispatcher("login.jsp") forward(request,response); 
// 请求转发跳转到html页面
req.getRequestDispatcher("login.html").forward(req, resp);//可以让请求从服务端跳转到客户端(或跳转到指定Servlet)

特点:
1.服务端行为
2.地址栏不发生改变
3.从始至终只有一个请求
4.request数据可以共享

5.request作用域

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

//设置域对象内容
req.setAttribute(String name,Object value);
//获取域对象内容
req.getAttribute(String name) ;
//删除域对象内容
req.removeAttribute(String name) ;

request域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然存在,则在请求转发的过程中可以通过request来传输/共享数据。

错误

java.lang.NullPointerException
“程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象

Application Server was not connected before run configuration stop, reason: Unable to ping server
端口被占用了,首先检查自己上一个Servlet程序是不是没有按结束,如果没有问题,可以尝试更换端口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ServletJavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。ServletJava Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值