HttpServletRequest接口
HttpServletRequest接口的作用
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中,然后传递到Service方法中去,我们可以通过HttpServletRequest对象获取到请求的信息
HttpServletRequest接口的常用方法
- getRequestURI():获取请求的URI地址
- getRquestURL():获取请求的绝对路径地址
- getRemoteHost():获取客户端的ip地址
- getHeader():获取指定的请求头信息
- getMethod():获取请求方式
- getAttribute():获取会话域数据
- setAttribute():设置会话域数据
- getRequestDispatcher():获取请求转发对象
- getParameter():获取请求的参数
如何获取请求的参数
直接上代码:
/head>
<body>
<form action="http://localhost:2233/JavaWeb_02/getLoginMessage" method="post">
用户名:<input type="text" name="username"/>
密 码:<input type="password" name="pwd">
<input type="submit"/>
</form>
</body>
</html>
以上定义了一个form表单,当我们点击提交按钮,就会将数据用户名和密码发送到指定的Servlet类,这里的action参数锁一下:http://localhost:2233/JavaWeb_02/getLoginMessage
http://localhost:2233/JavaWeb_02:表示当前的工程路径
/getLoginMessage:表示映射的Servler类
Servlet类的配置如下:
<servlet>
<servlet-name>GetLoginMessage</servlet-name>
<servlet-class>com.hsf.servlet.GetLoginMessage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetLoginMessage</servlet-name>
<url-pattern>/getLoginMessage</url-pattern>
</servlet-mapping>
Servlet类代码:
package com.hsf.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetLoginMessage extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("用户名:"+username);
String pwd = req.getParameter("pwd");
System.out.println("密码:" + pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求的字符集为utf-8,从而解决post请求的中文乱码问题
//这句话是设置请求体重内容的编码方式,因为get请求没有请求体,所以该方式不适合get请求。
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
System.out.println("用户名:"+username);
String pwd = req.getParameter("pwd");
System.out.println("密码:" + pwd);
}
}
运行如下:
Request请求乱码的问题
本段选自kaka_1994的
https://blog.csdn.net/javakaka666/article/details/79950161
解决request中文乱码问题,要分成两种情况:get请求和post请求
1.Get //这里取到的值是iso编码过后的值, 是乱码。因为Tomcat中默认使用的是iso8859-1编码
String username = request.getParameter("username");
//这里使用ISO的编码, 先逆转回去,变成字节数据,然后在用U8的编码转成中文
byte [] bytes = username .getBytes("ISO-8859-1");
username = new String(bytes, “utf-8”);
2.Post
//如果是Post方式提交的数据上来,解决乱码,一句话就可以了。
request.setCharacterEncoding(“UTF-8”); //这句话是设置请求体重内容的编码方式,因为get请求没有请求体,所以该方式不适合get请求。
请求转发的特点
客户端通过资源路径将请求发送给Servlet1,Servlet1拿到数据并对其进行处理,之后将请求转发给另一个Servlet2类,Servlet2类对参数进行处理再返回客户端
(画个图吧!)
以上,相信你应该已经对请求转发有一个大概的理解了,下面我们开始写代码:
我们先写一个form表单用来提交数据
<form action="http://localhost:2233/JavaWeb_02/getLoginMessage" method="get">
用户名:<input type="text" name="username"/>
密 码:<input type="password" name="pwd">
<input type="submit"/>
</form>
然后,创建一个的Servlet类去进行第一次接收处理
package com.hsf.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetLoginMessage extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("用户名:"+username);
String pwd = req.getParameter("pwd");
System.out.println("密码:" + pwd);
if(username.equals("fufu")&&pwd.equals("123456")){
//获取请求转发对象,这里的参数表示要转发的位置
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servletDemo1");
req.setAttribute("name","金木研");
requestDispatcher.forward(req,resp);
}
}
处理完之后在会话域中存入数据并将请求转发,这时候,第二个Servlet类接收到请求,并从会话域中拿到数据进行判断,结果为真,再进行其他操作,否则进行操作
package com.hsf.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String requestURI = req.getRequestURI();
if(req.getAttribute("name").equals("金木研")) {
System.out.println("获取请求的地址 => " + requestURI);
StringBuffer requestURL = req.getRequestURL();
System.out.println("获取请求资源的绝对路径 => " + requestURL);
String remoteHost = req.getRemoteHost();
System.out.println("获取客户端(发送请求的)的ip地址 => " + remoteHost);
String header = req.getHeader("Accept");
System.out.println("获取请求头的指定信息:=>" + header);
String method = req.getMethod();
System.out.println("获取请求的方式 =>" + method);
}else{
System.out.println(req.getAttribute("name"));
}
}
这里稍微提一下,存入会话域里的数据只在当前会话过程中有效,当我们切断会话是获取不到会话域里的数据的,所以会抛出NullpaintException异常,
以上,就是请求转发的全过程了!!!
2020-11-29 今日任务完成
————加油吧,代码人!