1. HttpServletRequest类基础方法记录
- request对象可以获得许多的东西,如下:
方法 | 获得的东西 |
---|---|
getRequestURL() | 获得客户端的URL |
getMethod() | 这个是获取get/post方法 |
getRemoteHost() | 获得客户端的IP地址 |
getHeader() | 获得请求头 |
getParameter() | 获取从从客户端传输过来的数据,参数为String,通过键值对取值 |
setCharacterEncoding() | 设置字符集格式,其中的参数是String类型的,用在获取客户端数据之前 |
getParameterValues() | 取得某个类型的多个数据,参数也是String类型 |
- 请求转发
在有些时候可能需要几个Servlet同时处理某个业务,这时可能就需要用到请求转发,因为处理的时候是直接从一个Servlet到达另一个Servlet,以下记录这些常用的方法;
第一个Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//先定义好接收的数据类型
request.setCharacterEncoding("UTF-8");
//获得来自于客户端的数据
String name = request.getParameter("user");
//打印输出一下
System.out.println(name);
//这里可以写Servlet1对业务的处理逻辑,也可以将处理逻辑通过setAttribute传到第二个Servlet;
//设置Request域的值,可以在整个Servlet里面进行传输;
request.setAttribute("key1", "已经经过第一个Servlet");
//创建一个RequestDispatcher对象,用来表示第二个Servlet的映射路径;
RequestDispatcher reqDis = request.getRequestDispatcher("/fourth");
//这个就是一个跳转
reqDis.forward(request, response);
}
第二个Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在这里可以获得第一个Servlet中传递过来的数据;
String Key1 = (String) request.getAttribute("key1");
System.out.println(Key1);
//当然也可以和第一个Servlet一样可以获得来自客户端的数据
String password = request.getParameter("password");
System.out.println(password);
//底下可以写在Servlet2中对业务的处理逻辑;
System.out.println("Servlet2处理完毕");
}
当数据提交到第一个Servlet之后,在控制台的输出结果;
请求转发的几个特点:1.跳转Servlet不改变地址栏;2.虽然跳转了Servlet,但实际上它们是一次请求;3.它们可以通过Request域来共享数据;4.它们最大的特点是可以访问到WEB-INF里面的资源,实际上,无法在浏览器中直接访问这个文件夹中的资源;5.缺点就是,所有的资源使用的都是在当前工程下,无法跳出已有的工程,去访问工程外部的资源;
界面应该都是放在web目录下;
- base标签的使用
base标签设置的是页面相对路径工作时参照的地址;(一般的相对路径都是取决于当前页面的路径作为相对路径的依据,)
base标签的使用位置是放在head 标签里面;
首先:给个起始的目录
如过通过servlet中的请求转发进行页面的跳转,跳转(使用相对路径)之后很容易出现找不到资源,也就是路径错误;
如下:Servlet程序
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("已经进入了Servlet");
//通过这行代码,进行跳转;
req.getRequestDispatcher("../Html/TestA.html").forward(req, res);
}
在href属性中输入的路径,显示协议,IP地址,端口号,当前工程路径,当前资源目录;
- 在Servlet中如何传递数据到客户端?
1. 通过字节流,方法是getOutputStream();用于传送文件等;
2.通过字符流,方法是getWriter();常用于发送字符串;
这里需要注意的点就是,传递数据时,只能使用一种方法(要么使用字节流,要么使用字符流),不能同时使用两种,仔细一想,你同时使用两种方法的话,客户端该怎么区分,怎么接受;//通过设置响应头,使得浏览器也使用自己设置的UTF-8;避免乱码;获取流之前才有效,也就是在调用getWriter方法之前; resp.setHeader("Content-type","text/html;charset=utf-8"); PrintWriter wrt = resp.getWriter(); wrt.write("测试getWriter方法"); //还有print方法也可以; wrt.print("测试getWriter方法");
- Servlet中的请求重定向
简单来说:是指在客服端向服务器发送请求之后,服务器将一个可以完成客户端的要求的新地址发给客户端,叫客户端去访问;
其中需要用到的参数有响应码和Location(新URL地址),也是直接跳转;
与Servlet中的请求转发区别:- 浏览器地址发生改变;
- 需要进行两次请求;
- 不共享request域中的数据(在我理解看来,就是它其实是通过服务器重新连接一个后台的Servlet,所有无法共享request域数据);
- 可以访问工程外的资源;
//设置状态码,必须要设置
response.setStatus(301);//可以301,也可以302
//用于创建一个跳转的网址;
response.setHeader("Location", "http://www.baidu.com");
在JavaWeb中的重定向中,除了上面这一种方法,还可以直接使用sendRedirect()方法;
Java杂记
1. 在Java中路径../表示上一级目录;例如:
以上面目录作为基础时,当前目录如果在TestBase.jsp中时,需要访问到TestA.html文件时,则需要的路径就是(../Html/TestA.html
)
2. 在javaweb的浏览器中,/代表的是根路径(http://IP地址:端口号);在服务器中,也就是可以简单的理解为在Servlet,/代表(http://IP地址:端口号/工程路径);工程路径可以简单的理解为你在IDEA中的那个Modul名,一般可以自己修改(之前记录过,不过多赘述);
3. 一般情况下,浏览器的默认编码是GBK;
4. 响应码302是指临时性的重定向(并非永远都是那个重定向的URL,可能会修改),301是永久的重定向;