HttpServletRequest接口中的常用方法
获取客户端ip地址:String getRemoteAddr()
获取浏览器的请求方式:String getContextPath()
获取浏览器的请求方式:String getMethod()
获取URI:String getRequestURI()
获取URL:StringBuffer getRequestURL()
获取url-pattern:String getServletPath()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/28/RequestDemo1">测试request常用方法</a>
</body
</html>
package ServletRequest;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/RequestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
//获取上下文的路径
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取请求的uri
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//获取请求的url
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//获取servlet path
String servletPath = request.getServletPath();
System.out.println(servletPath);
//获取浏览器的请求方式
String method = request.getMethod();
System.out.println(method);
//获取客户端IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost(request, response);
}
}
ServletRequest接口中request对象范围
HttpServletRequest是一个怎样的范围?
HttPServletRequest类型的变量通常命名为:request,代表当前的本次请求,一次请求对应一个request对象,100个请求对应100个request对象。请求范围是极小的。request只能完成在同一次请求中完成传递数据。
向request范围中添加数据:
void setAttribute(String name, Object o)
从request中获取数据:
Object getAttribute(String name)
向request范围中移除:
void removeAttribute(String name)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/28/RequestDemo1">测试request常用方法1</a>
<br>
<a href="/28/AServlet">AServlet</a>
<a href="/28/BServlet">BServlet</a>
</body>
</html>
在AServlet中存储数据,可以在AServlet中取出数据
package ServletRequest;
import domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//床架User对象
User user = new User();
user.setUsercode("111");
user.setUsername("zhangsan");
//将user对象存储到request范围中
request.setAttribute("user",user);
//从request范围中取出User对象
Object user1 = request.getAttribute("user");
System.out.println(user1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在AServlet中存储数据,无法在Bservlet中取出数据,因为request对象只能在同一次请求中完成数据传递。
package ServletRequest;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request范围中取出User对象
Object user1 = request.getAttribute("user");
System.out.println(user1);//null
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
跳转:
执行完AServlet之后,跳转到BServlet执行,将AServlet执行和BServlet执行放到同一个请求当中,必须使用转发技术forward:
1.获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
2.调用请求转发器的forword方法即可完成转发
package ServletRequest;
import domain.User;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//床架User对象
User user = new User();
user.setUsercode("111");
user.setUsername("zhangsan");
//将user对象存储到request范围中
request.setAttribute("user",user);
//从request范围中取出User对象
Object user1 = request.getAttribute("user");
System.out.println(user1);
//获取请求转发器对象,并将转发器指向BServlet
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/BServlet");
//调用请求转发器的forword方法即可完成转
requestDispatcher.forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
此事只需要点击AServlet即可,只是一次请求,不需要再点击BServlet
关于范围的选择:
ServletContext应用范围可以跨用户传递数据
ServletRequest应用范围只能在同一个请求中传递数据(可以跨Servlet传递数据,但是多个Servlet必须在同一个请求中)
优先选择request范围。
关于项目中的乱码问题
数据乱码经常出现的位置:
-
数据保存中的乱码:
最终保存到数据库表的时候出现乱码
导致数据保存过程中的乱码包括以下两种情况:
在保存之前数据是乱码的,保存到数据库之后一定是乱码的
在保存前不乱吗,由于数据库不支持简体中文,保存后出现乱码 -
数据展示过程中的乱码:
最终展示在网页上的数据出现中文乱码
经过执行java程序之后,java程序负责向浏览器响应的时候中文出现乱码,怎么解决?
response.setContentType("text/html;charset=UTF-8");
没有执行java程序,直接访问页面,出现中文乱码,怎么解决?
<meta charset="UTF-8">
-
数据传递过程中的乱码?
将数据从浏览器传递给服务器的过程中出现的乱码
Tomcat 接收请求在没有设置的情况下默认为ISO-8859-1编码
第一种方式:解决Post请求乱码
这种方式目前针对Post方法,因为get方式已经解决了中文乱码问题
String dname = request.getParameter("dname");
//将dname字符串解码
byte[] bytes = dname.getBytes("ISO-8859-1");
//将bytes编码,但是需要和浏览器的编码方式一致
dname = new String(bytes, "UTF-8");
System.out.println(dname);
第二种方式:支持post请求中文乱码问题
void setCharacterEncoding(String env)
这种方式必须在获取数据之前进行设置
第三种方式:专门解决get请求方式乱码问题,这种方式只对请求行有效
修改:CATALINA_HOME/conf/server.xml
文件,以后就不用设置get请求方式的编码方式了
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
package ServletRequest;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//第一种解决方案
/*
String dname = request.getParameter("dname");
//将dname字符串解码
byte[] bytes = dname.getBytes("ISO-8859-1");
//将bytes编码,但是需要和浏览器的编码方式一致
dname = new String(bytes, "UTF-8");
System.out.println(dname);
*/
//第二种解决方案
//告诉Tomcat使用UTF-8的方式进行编码,只对Post请求体中的数据进行编码
request.setCharacterEncoding("UTF-8");
//从表单中取出数据,设置代码必须在取数据之前进行
String dname = request.getParameter("dname");
System.out.println(dname);
//第三种解决方案
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost(request, response);
}
}