HttpServletRequest的使用
- 格式:doc
- 大小:91.00 KB
- 文档页数:4
1)、要知道javax.servlet.http.HttpServlet这个类时谁定义的?回答:这个类是由SUN定义的一个基于HTTP请求的类,这个类在java中属于javaEE规范,既是java的企业级应用。
如果我们编写的程序想基于HTTP请求,就要实现该抽象类中的doXXX方法。
2)、这个类是抽象类吗?回答:是抽象类。
3)、这个类能为子类提供哪些功能(已经实现了的功能)?回答:提供了如下功能:回答:该抽象类中没有抽象方法,即不要求子类必须实现某抽象方法。
但是有建议:练习:获取请求者的IP 地址。
根据该情况分析,该应用必须是一个Web应用。
且该应用是一个动态的Web应用。
1、在磁盘上建立一个应用的根目录(myweb)。
这个目录下存放可以基于浏览器访问的html页面和Servlet。
2、根目录(应用名称):动态web应用的基本结构,如下图:3、编写用户请求的方式:比如超链接、form表单都可以请服务器发送请求。
4、编写处理请求的Servlet:比如有ervlet:whz.servlet.test.MyServlet。
将该Servlet编译到5、对classes文件夹中的Servlet(MyServlet)进行注册:在WEB-INF下的web.xml文件中注册。
注册方式如下:6、部署应用:将该应用拷贝到tomcat的根目录下的webapps目录下。
7、启动tomcat,发布部署的应用。
8、根据协议、主机地址、端口号、应用名称、资源名称(uri)访问。
比如:http://127.0.0.1:8080/myweb/mys访问我们定义的Servlet(whz.servlet.test.MyServlet)。
3、Servlet的创建与销毁当一个Servlet第一次被访问时,由Servlet容器(Tomcat)自行创建,且该Servlet在Servlet容器中只有一个对象,这一个对象被所有的访问者(请求)共用。
java中的request的用法Java是一种广泛使用的编程语言,被广泛应用于web开发中。
在Java中,request对象是一个非常重要的对象,用于处理客户端与服务器之间的通信。
本文将介绍Java中request对象的基本用法和相关注意事项。
1. request对象的概述request对象用于封装HTTP请求的信息,包括请求的URL、头部信息、请求参数等。
在Java中,可以通过HttpServletRequest类来实例化request对象。
它是一个接口,定义了访问请求信息的方法。
通常,我们从服务器端接收到request对象,然后根据请求的参数来进行相应的逻辑处理。
2. 获取请求参数request对象提供了多个方法来获取请求参数。
常用的方法有:- getParameter(String name):根据参数名获取单个参数值。
- getParameterValues(String name):根据参数名获取多个参数值,返回一个数组。
- getParameterMap():返回一个包含所有参数名和值的Map对象。
- getParameterNames():返回一个包含所有参数名的Enumeration对象。
3. 获取请求头信息request对象还提供了一系列方法来获取请求头信息。
常用的方法有:- getHeader(String name):根据头部信息名获取对应的值。
- getHeaders(String name):根据头部信息名获取对应的所有值,返回一个Enumeration对象。
- getHeaderNames():返回一个包含所有头部信息名的Enumeration 对象。
4. 获取请求的URL和URIrequest对象中也包含了获取请求URL和URI的方法。
常用的方法有:- getRequestURL():返回一个StringBuffer对象,包含请求的URL。
- getRequestURI():返回一个字符串,包含请求的URI。
Request常⽤⽅法(总结)⼀、HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客户端请求的所有信息。
⼆、Request常⽤⽅法2.1、获得客户机信息 getRequestURL⽅法返回客户端发出请求时的完整URL。
getRequestURI⽅法返回请求⾏中的资源名部分。
getQueryString ⽅法返回请求⾏中的参数部分。
getPathInfo⽅法返回请求URL中的额外路径信息。
额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr⽅法返回发出请求的客户机的IP地址。
getRemoteHost⽅法返回发出请求的客户机的完整主机名。
getRemotePort⽅法返回客户机所使⽤的⽹络端⼝号。
getLocalAddr⽅法返回WEB服务器的IP地址。
getLocalName⽅法返回WEB服务器的主机名。
2.2、获得客户机请求头 getHeader(string name)⽅法:String getHeaders(String name)⽅法:Enumeration getHeaderNames()⽅法2.3、获得客户机请求参数(客户端提交的数据)getParameter(String)⽅法(常⽤)getParameterValues(String name)⽅法(常⽤)getParameterNames()⽅法(不常⽤)getParameterMap()⽅法(编写框架时常⽤)3.6、提交中⽂数据乱码问题总结 1、如果提交⽅式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,⽐如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding(“UTF-8”)) 2、如果提交⽅式为get,设置request对象的编码是⽆效的,request对象还是以默认的ISO8859-1编码接收数据,因此要想不乱码,只能在接收到数据后再⼿⼯转换,步骤如下: 1).获取获取客户端提交上来的数据,得到的是乱码字符串,data=”è??” String data = request.getParameter(“paramName”); 2).查找ISO8859-1码表,得到客户机提交的原始数据的字节数组 byte[] source = data.getBytes(“ISO8859-1”); 3).通过字节数组以指定的编码构建字符串,解决乱码 data = new String(source, “UTF-8”); 通过字节数组以指定的编码构建字符串,这⾥指定的编码是根据客户端那边提交数据时使⽤的字符编码来定的,如果是GB2312,那么就设置成data = new String(source, “GB2312”),如果是UTF-8,那么就设置成data = new String(source, “UTF-8”)四、Request对象实现请求转发4.1、请求转发的基本概念 请求转发:指⼀个web资源收到客户端请求后,通知服务器去调⽤另外⼀个web资源进⾏处理。
软件包:javax.servlet.http所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。
所包含的类:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。
一、HttpServletRequest接口定义public interface HttpServletRequest extends ServletRequest;用来处理一个对Servlet的HTTP格式的请求信息。
方法1、getAuthTypepublic String getAuthType();返回这个请求的身份验证模式。
2、getCookiespublic Cookie[] getCookies();返回一个数组,该数组包含这个请求中当前的所有cookie。
如果这个请求中没有cookie,返回一个空数组。
3、getDateHeaderpublic long getDateHeader(String name);返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。
如果头域不能转换,抛出一个IllegalArgumentException。
如果这个请求头域不存在,这个方法返回-1。
4、getHeaderpublic String getHeader(String name);返回一个请求头域的值。
(译者注:与上一个方法不同的是,该方法返回一个字符串)如果这个请求头域不存在,这个方法返回-1。
5、getHeaderNamespublic Enumeration getHeaderNames();该方法返回一个String对象的列表,该列表反映请求的所有头域名。
有的引擎可能不允许通过这种方法访问头域,在这种情况下,这个方法返回一个空的列表。
Request的包装类HttpServletRequestWrapper的使⽤说明⽬录Request的包装类HttpServletRequestWrapper使⽤⼤致的意思是:上述⽅案解决了HttpServletRequestWrapper和HttpServletResponseWrapper使⽤时的坑WrapperRequest和WrapperResponse的使⽤这⾥涉及到的坑坑1坑2解决问题问题延伸Request的包装类HttpServletRequestWrapper使⽤在使⽤zuul进⾏鉴权的时候,我们希望从请求Request中获取输⼊流,解析⾥⾯的内容,奈何InputStream只能被读取⼀次。
为啥呢?源码⾥是这样说的:public int read(byte[] b,int off, int len) Reads up to len bytes of data into an array of bytes from this input stream. Ifpos equals count, then -1 is returned to indicate end of file.Otherwise, the number k of bytes read is equal to the smaller of len and count-pos.If k is positive, then bytes buf[pos] through buf[pos+k-1] are copied into b[off] through b[off+k-1] in the manner performed by System.arraycopy. The value k is added into pos and k is returned. ⼤致的意思是:在InputStream读取的时候,会有⼀个pos指针,它指⽰每次读取之后下⼀次要读取的起始位置。
java获取request中的请求参数在Java中获取请求参数有多种方式,下面列举了其中几种常用的方法。
1. 使用HttpServletRequest对象获取请求参数:```javaHttpServletRequest request = ...; // 获取HttpServletRequest 对象String parameter = request.getParameter("paramName"); // 获取名为"paramName"的请求参数的值```2. 使用HttpServletRequest对象获取所有请求参数的名称和值:```javaHttpServletRequest request = ...; // 获取HttpServletRequest 对象Enumeration<String> parameterNames =request.getParameterNames(; // 获取所有请求参数的名称while (parameterNames.hasMoreElements()String paramName = parameterNames.nextElement(;String paramValue = request.getParameter(paramName);//处理参数名称和值```3. 使用HttpServletRequest对象获取请求参数的数组:```javaHttpServletRequest request = ...; // 获取HttpServletRequest 对象String[] parameterValues =request.getParameterValues("paramName"); // 获取名为"paramName"的请求参数的值数组```4. 使用HttpServletRequest对象获取请求参数的Map:```javaHttpServletRequest request = ...; // 获取HttpServletRequest 对象Map<String, String[]> parameterMap =request.getParameterMap(; // 获取所有请求参数的Map,键为参数名称,值为参数值数组``````java//处理请求参数``````java//处理请求参数``````java//处理请求参数```以上是一些常用的获取请求参数的方法,根据实际情况选择适合的方法来获取请求参数。
java 获取当前请求域名的方法Java是一种广泛应用于开发各种类型应用的编程语言。
在Web开发中,获取当前请求域名是一项常见的需求。
本文将介绍几种使用Java获取当前请求域名的方法。
方法一:使用HttpServletRequest对象在Java Web应用中,可以使用HttpServletRequest对象来获取当前请求的信息。
其中,getRequestURL()方法可以返回一个StringBuffer对象,该对象包含了请求的完整URL。
我们可以从中提取出域名部分。
```javaimport javax.servlet.http.HttpServletRequest;public class DomainUtil {public static String getCurrentDomain(HttpServletRequest request) {StringBuffer url = request.getRequestURL();int index = url.indexOf("://") + 3;int endIndex = url.indexOf("/", index);return url.substring(index, endIndex);}}```方法二:使用URL对象Java的包中提供了URL类,可以用于解析URL并获取其中的各个部分。
通过创建URL对象,我们可以方便地获取当前请求的域名。
```javaimport .MalformedURLException;import .URL;public class DomainUtil {public static String getCurrentDomain(String url) throws MalformedURLException {URL currentUrl = new URL(url);return currentUrl.getHost();}}```方法三:使用ServletRequest对象在Java Web应用中,ServletRequest是一个通用的请求对象接口。
HttpServletRequest对象⽅法的⽤法⼩结深⼊体验JavaWeb开发内幕——关于HttpServletRequestRequest对象HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发⼈员通过这个对象的相关⽅法,即可以获得客户的这些信息。
⼀、通过request常⽤⽅法获得相关信息:1、通过request常⽤⽅法获得客户机信息getRequestURL⽅法返回客户端发出请求时的完整URL。
getRequestURI⽅法返回请求⾏中的资源名部分。
getQueryString ⽅法返回请求⾏中的参数部分。
getRemoteAddr⽅法返回发出请求的客户机的IP地址getRemoteHost⽅法返回发出请求的客户机的完整主机名getRemotePort⽅法返回客户机所使⽤的⽹络端⼝号getLocalAddr⽅法返回WEB服务器的IP地址。
getLocalName⽅法返回WEB服务器的主机名getMethod得到客户机请求⽅式例如在Request.Java中加⼊如下代码://返回相关请求的信息String uri=request.getRequestURI();Stringrad = request.getRemoteAddr();Stringrh = request.getRemoteHost();Stringru = request.getRemoteUser();intrp = request.getRemotePort();Stringcp = request.getContextPath();Stringla = request.getLocalAddr();Stringce = request.getCharacterEncoding();Stringgm = request.getMethod();Stringqs = request.getQueryString();System.out.println(uri);System.out.println(rad);System.out.println(rh);System.out.println(ru);System.out.println(rp);System.out.println(cp);System.out.println(la);System.out.println(ce);System.out.println(gm);System.out.println(qs);即可获取相关信息。
Java中Request对象的常用方法
在Java中,HttpServletRequest对象是用于获取客户端发送给服务器的HTTP 请求信息的。
以下是HttpServletRequest对象中常用的10个方法及其作用:
1.getMethod() - 返回请求中的HTTP方法(如GET、POST等)。
2.getHeader(String name) - 返回请求头中指定名称的值。
3.getHeaderNames() - 返回请求头中所有名称的Enumeration。
4.getCookies() - 返回客户端发送的所有cookies。
5.getIntParameter(String name) - 返回请求参数中指定名称的整数值。
6.getStringParameter(String name) - 返回请求参数中指定名称的字符
串值。
7.getProtocol() - 返回使用的协议名和版本。
8.getScheme() - 返回使用的方案名(如http、https)。
9.getServerName() - 返回接收请求的服务器的主机名。
10.getServerPort() - 返回接收请求的服务器的端口号。
这些方法为Java Web开发提供了方便的途径,使得开发者可以轻松地获取和处理HTTP请求中的信息。
使⽤HttpServletRequestWrapper重写Request请求参数⽬的: 改变请求参数的值,满⾜项⽬需求(如:过滤请求中 lang != zh 的请求)⽅法: 1.使⽤ HttpServletRequestWrapper重写1public class ChangeRequestWrapper extends HttpServletRequestWrapper {2private Map<String, String[]> parameterMap; // 所有参数的Map集合34public ChangeRequestWrapper(HttpServletRequest request) {5super(request);6 parameterMap = request.getParameterMap();7 }89// 重写⼏个HttpServletRequestWrapper中的⽅法1011/**12 * 获取所有参数名13 *14 * @return返回所有参数名15*/16 @Override17public Enumeration<String> getParameterNames() {18 Vector<String> vector = new Vector<String>(parameterMap.keySet());19return vector.elements();20 }2122/**23 * 获取指定参数名的值,如果有重复的参数名,则返回第⼀个的值接收⼀般变量,如text类型24 *25 * @param name 指定参数名26 * @return指定参数名的值27*/28 @Override29public String getParameter(String name) {30 String[] results = parameterMap.get(name);31return results[0];32 }333435/**36 * 获取指定参数名的所有值的数组,如:checkbox的所有数据37 * 接收数组变量,如checkobx类型38*/39 @Override40public String[] getParameterValues(String name) {41return parameterMap.get(name);42 }4344 @Override45public Map<String, String[]> getParameterMap() {46return parameterMap;47 }4849public void setParameterMap(Map<String, String[]> parameterMap) {50this.parameterMap = parameterMap;51 }52 }2.新增Filter1public class LangFilter implements Filter {2 @Override3public void init(FilterConfig filterConfig) throws ServletException {45 }67 @Override8public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 910 ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);1112 Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());1314 String[] strings = parameterMap.get("lang");//逻辑代码给定默认的参数值,如果参数不为中⽂,则直接返回异常15if (strings == null || strings.length == 0) {16 strings = new String[1];17 strings[0] = "zh";18 parameterMap.put("lang", strings);19 changeRequestWrapper.setParameterMap(parameterMap);20 }else{21 String language = strings[0];22if (!language.equals("zh")) {23 Map<String,String> error = new HashMap<>();24 error.put("code","500");2526 ServletOutputStream outputStream = null;27try {28 outputStream = servletResponse.getOutputStream();29 outputStream.write(JSONUtils.obj2Byte(error));30 } finally {31if (outputStream != null) {32 outputStream.flush();33 outputStream.close();34 }35 }3637return;38 }39 }40//使⽤复写后的wrapper41 filterChain.doFilter(changeRequestWrapper, servletResponse);42 }4344 @Override45public void destroy() {4647 }48 }3.web.xml增加⼀个过滤器处理1 <filter>2<filter-name>languageFilter</filter-name>3<filter-class>ngFilter</filter-class>4<init-param>5<param-name>encoding</param-name>6<param-value>UTF-8</param-value>7</init-param>8<init-param>9<param-name>forceEncoding</param-name>10<param-value>true</param-value>11</init-param>12</filter>1314<filter-mapping>15<filter-name>languageFilter</filter-name>16<url-pattern>*.do</url-pattern>17</filter-mapping>所有.do的请求,都会验证此参数。
请求信息的取得当请求来到服务器时,Web 容器会创建HttpServletRequest 实例来包装请求中的相关信息,HttpServletRequest 接口继承自ServletRequest 接口,后者定义了取得一些通用请求信息的方法,如getParameter()、getInputStream()等方法,前者定义了取得HTTP 相关信息的方法,例如getHeader()、getMethod()等。
处理请求时最基本的就是取得请求参数: getQueryStirng() 取得HTTP 请求的查询字符串 getParameter() 指定请求参数来取得对应的值 getParameterValues() 取得一个String 数组,数组元素代表被选择选项的值 getHeader() 指定标头后可以返回字符串值 getHeaderNames() 取得浏览器所发出的所有标头值一个简单地例子:?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <code class ="language-java hljs ">import java.io.IOException; import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet ("/ShowHeader")public class ShowHeader extends HttpServlet {protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter();out.println("</code>"); out.println(""); out.println(" "); out.println(""); out.println(""); out.println("Servlet Header at " + request.getContextPath() + ""); Enumeration e = request.getHeaderNames(); while (e.hasMoreElements()) { String param = e.nextElement(); String value = request.getHeader(param); out.print(param + ": " + value + ""); } out.println(""); out.println(""); out.close(); } protected voiddoGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } 中文处理问题若要传送给浏览器UTF-8编码的文字,可以执行如下语句:response.setContentType("text/html;charset=utf-8");若接收请求时也使用UTF-8编码字符串,则可以在取得请求之前,执行以下语句: request.setCharacterEncoding("utf-8");另一个处理编码的方式是取得请求值之后,通过String 的getBytes()取得指定编码的该字符串的字节数组,然后再重新构造utf-8字符串,执行以下语句:?1 2 <code class ="language-java hljs ">String username =request.getParameter("name");String username = new String(user.getBytes("ISO-8859-1"),"utf-8");</code>如果java 原始代码文件中编写了中文字符串,则编译.java 时,可以指定-encoding 选项来指定编码,例如:javac -encoding itf-8 Main.java在编写JSP 时,若使用utf-8编码,可以使用以下语句,告知Web 容器将.jsp 转移为.java 以及进行编译时,必须使用utf-8编码格式:%@page pageEncoding="UTF-8"%以下是一个简单的例子:myform.html:?1 2 <code class ="hljs xml"></code>姓名:邮件:你喜爱的宠物代表:Pet.java:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <code class ="language-java hljs ">import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet ("/pet.do")public class Pet extends HttpServlet{protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String name = request.getParameter("user");String email = request.getParameter("email");String[] types = request.getParameterValues("type");out.println("</code>"); out.println(""); out.println(" "); out.println(""); out.println(""); out.println("联系人:" + name + ", 邮箱:" + email + ""); out.println("喜爱的宠物类型"); out.println("∙"); for (int i = 0; i < types.length; i++) { out.println(" ∙" + types[i] + " ∙ "); } out.println(""); out.println(""); out.println(""); out.close(); } }请求转发与包含若想要转发给别的Servlet/JSP ,则可以使用HttpServletRequest 的getRequestDispatcher()方法取得RequestDispatcher 实例,运行时可指定要转发请求的相对URL 网址或绝对URL 。
若决定要指定forward()方法,就表示目前的Servlet/JSP 不进行响应,而是将响应的职责交给下一个转发的对象。
因此在执行forward()之前,不能对浏览器有确认(commit)的回应(也就是真正送出HTTP回应给浏览器),否则会发生IllegalStateException异常,而任何未确认的输出(Uncommitted Output)在forward()之前会自动清除。
在forward()的Servlet/JSP处理完毕之后,执行流程会回到原Servlet/JSP,这时可以继续做一些流程处理,但无法再对浏览器进行响应。