目录

​一、知识点​

​二、例子​

​2.1 例1 获取请求参数​

​2.1.1 代码​

​2.1.2 测试结果​

​2.2 例2 根据请求参数的名字,返回请求参数对应的字符串数组​

​2.2.1 在index.jsp编写表单​

​2.2.2 修改Login.java代码​

​2.2.3 测试结果​

​2.3 例3 请求参数返回枚举及Map对象​

​2.3.1 在Login.java添加代码​

​2.3.2 测试结果​

​三、HttpServletRequest(ServletReques子接口)​

​3.1 例子:获取客户端的URI​

​3.1.1 实现代码​

​3.1.2 测试结果​


本章讲的是servet请求,也比较重要的章节,ServletRequest看名字就知道是处理请求的。

一、知识点

如何在Serlvet中获取请求信息:

1.Servlet 的service()方法用于应答请求:因为每次请求都会调用service()方法

public void service(ServletRequest request, ServletResponse response ) throws ServletException, IOException ServletRequest:封装了请求信息。可以从中获取到任何的请求信息。 ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现.

这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法时传入。

2.ServletRequest: 封装了请求信息。可以从中获取到任何的请求信息。

1)获取请求参数:
String getParameter(string name):根据请求参数的名字,近回参数值。
若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值。

String[] getParametervalues(string name): 根据请求参数的名字,近回请求参数对应的字符串数组。

Enumeration getParameterNames():返回参数名对应的Enumeration对象,
类似于Serv1etConfig(或ServletContext)的getInitParameterNames()方法。

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

2)获取请求的URL:

HttpServletRequest httpServletRequest = (HttpServ1etRequest) request; String requestURI = httpServ1etRequest.getRequestURI(); System.out.println(requestURI); // /day_ 29/1oginServ1et

3)获取请求方式:

String method = httpServletRequest.getMethod(); System.out.print1n(method); //GET

4)若是-一个GET请求,获取请求参数对应的那个字符串,即?后的那个字符串.

String queryString = httpServletRequest.getQueryString(); //user=hua&password=123456&interesting=game&interesting=par System.out.print1n(querystring);

5)获取请求的Serlvet的映射路径

​String servletPath = httpServletRequest.getServletPath(); System.out.print1n(servletPath); // /loginServ1et​

6)和attribute相关的几个方法;

3. HttpServletRequest:是SerlvetRequest的子接口。针对于HTTP请求所定义。里边包含了大量获取HTTP请求相关的方法。

更多方便请查看​​https://javaee.github.io/javaee-spec/javadocs/​​中的ServletRequest接口

 

二、例子

下面所有例子都一样,src下建立一个Login类并继承Servlet接口,原始代码如下:

import javax.servlet.*;
import java.io.IOException;

public class Login implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {

}

@Override
public ServletConfig getServletConfig() {
return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

web.xm配置添加一个路由映射,如下:

<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>Login</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

整个web.xlm配置如下:这个配置包括了上一章的web.xml配置

<servlet>
<servlet-name>login</servlet-name>
<servlet-class>Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>t1</servlet-name>
<servlet-class>T1</servlet-class>
<!-- 在<servlet>下面是它的二级配置-->
<init-param>
<param-name>user</param-name>
<param-value>hua</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</init-param>
</servlet>

<!-- 这个是在<servlet>外面,不是它的二级配置-->
<context-param>
<param-name>ctx</param-name>
<param-value>this is context-param value </param-value>
</context-param>
<servlet-mapping>
<servlet-name>t1</servlet-name>
<url-pattern>/t1</url-pattern>
</servlet-mapping>

2.1 例1 获取请求参数

string getParameter(String name): 根据请求参数的名字,返回参数值。
若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值。

2.1.1 代码

Login.java其中一个代码修改如下:

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String user = servletRequest.getParameter("user");
String pwd = servletRequest.getParameter("pwd");
System.out.println(user+":"+pwd);
}

2.1.2 测试结果

根据HTML知识,要用Get方式传参用“?参数名=值”或“?参数名1=值1&参数名2=值2..”

打开浏览器尾部添加 “/login?user=hua&pwd=123”,我这里是

​http://localhost:8080/myservlet_war_exploded/login?user=hua&pwd=123​

看到空白页之后,再查看ide输出窗口为:

hualinux servlet 2.13:ServletRequest 接口及其子接口_hualinux

 

2.2 例2 根据请求参数的名字,返回请求参数对应的字符串数组

什么情况下才返回 数组呢?多选就是了

 String[] getParameterValues(String name):根据请求参数的名字,返回请求参数对应的字符串数组。

2.2.1 在index.jsp编写表单

在index.jsp编写表单,代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试</title>
</head>
<body>
<form action="login" method="post">
user: <input type="text" name="user" />
pwd: <input type="password" name="pwd" />
<br>
爱好:<br>
<input type="checkbox" name="interesting" value="reading" />阅读
<input type="checkbox" name="interesting" value="game" />游戏
<input type="checkbox" name="interesting" value="party" />派对
<input type="checkbox" name="interesting" value="shopping" />购物
<input type="checkbox" name="interesting" value="sport" />体育
<input type="checkbox" name="interesting" value="TV" />电视<br/>
<input type="submit" style="margin-left: 390px" value="提交"/>
</form>
</body>
</html>

运行tomcat,自动跳出浏览器,我的是火狐,效果图如下:

hualinux servlet 2.13:ServletRequest 接口及其子接口_hualinux java_02

2.2.2 修改Login.java代码

修改Login.java代码如下:

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String user = servletRequest.getParameter("user");
String pwd = servletRequest.getParameter("pwd");
System.out.println(user+":"+pwd);

String[] interestings =servletRequest.getParameterValues("interesting");
for(String interest: interestings){
System.out.println("-->"+interest);
}
}

2.2.3 测试结果

重启tomcat,在打开浏览器输入下面内容:

hualinux servlet 2.13:ServletRequest 接口及其子接口_hualinux java_03

点“提交”,ide显示结果为:

hualinux servlet 2.13:ServletRequest 接口及其子接口_ServletRequest_04

 

2.3 例3 请求参数返回枚举及Map对象

Enumeration getParameterNames(): 返回参数名对应的Enumeration对象,
类似于ServletConfig(或ServletContext)的getInitPar ameterNames()方法。

Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值,string数组类型.

2.3.1 在Login.java添加代码

在Login.java修改如下:

import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String user = servletRequest.getParameter("user");
String pwd = servletRequest.getParameter("pwd");
System.out.println(user+":"+pwd);

String[] interestings =servletRequest.getParameterValues("interesting");
for(String interest: interestings){
System.out.println("-->"+interest);
}

Enumeration<String> names = servletRequest.getParameterNames();
while (names.hasMoreElements()){
String name = names.nextElement();
String val = servletRequest.getParameter(name);
System.out.println("^^"+name+": "+val);
}

Map<String,String[]> map = servletRequest.getParameterMap();
for (Map.Entry<String,String[]> entry : map.entrySet()) {
System.out.println("**"+entry.getKey()+": "+ Arrays.asList(entry));
}
}

2.3.2 测试结果

重启tomcat,在打开浏览器输入下面内容:

hualinux servlet 2.13:ServletRequest 接口及其子接口_hualinux java_03

点“提交”,ide显示结果为:

hualinux servlet 2.13:ServletRequest 接口及其子接口_请求参数_06

 

三、HttpServletRequest(ServletReques子接口)

HttpServletRequest子接口更针对Http请求方面,封装了比servlet更多的http方面的方法

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

3.1 例子:获取客户端的URI

3.1.1 实现代码

在Loin.java类中的service()方法直接添加如下内容

//这个是在顶部添加的导入类
import javax.servlet.http.HttpServletRequest;


//HttpServletRequest是ServletRequest的子接口,可以强转为ServletRequest接口
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
String requestURI = httpServletRequest.getRequestURI();
System.out.println(requestURI);

3.1.2 测试结果

重启tomcat,在打开浏览器输入下面内容:

hualinux servlet 2.13:ServletRequest 接口及其子接口_hualinux java_03

点“提交”,ide显示结果为:

hualinux servlet 2.13:ServletRequest 接口及其子接口_java_08