java web中servlet详解_Java Web(5)-Servlet详解(下)

一、HttpServletRequest 类

1. HttpServletRequest 类作用?

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用,可以通过 HttpServletRequest 对象,获取到所有请求的 信息

2. HttpServletRequest 类的常用方法

getRequestURI() 获取请求的资源路径

getRequestURL() 获取请求的统一资源定位符(绝对路径)

getRemoteHost() 获取客户端的 ip 地址

getHeader() 获取请求头

getParameter() 获取请求的参数

getParameterValues() 获取请求的参数(多个值的时候使用)

getMethod() 获取请求的方式 GET 或 POST

setAttribute(key, value); 设置域数据

getAttribute(key); 获取域数据

getRequestDispatcher() 获取请求转发对象

具体如下:

首先把环境建好,配置好web.xml ,然后在类中

package com.md.servlet;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* @author MD

* @create 2020-07-25 8:18

*/

public class RequestAPIServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println(req.getRequestURI());// /04_Servlet/requestAPIServlet

System.out.println(req.getRequestURL());

//http://localhost:8080/04_Servlet/requestAPIServlet

System.out.println(req.getRemoteHost());//127.0.0.1

System.out.println(req.getHeader("User-Agent"));//Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

System.out.println(req.getMethod());//GET

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

super.doPost(req, resp);

}

}

对应的web.xml

RequestAPIServlet

com.md.servlet.RequestAPIServlet

RequestAPIServlet

/requestAPIServlet

3. 获取请求参数

首先在web下面建立html文件,如下

Title

用户名:

密码:

爱好:C++

Java

Python

然后是对应的java代码,以及配置的web.xml(和上面的类似)

/**

* @author MD

* @create 2020-07-25 8:31

*/

public class ParameterServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("------------doGet--------------");

// 获取请求的参数

String username = req.getParameter("username");

String password = req.getParameter("password");

// String hobby = req.getParameter("hobby");

// 当有多个值的时候

String [] hobby = req.getParameterValues("hobby");

System.out.println("用户名:"+username);

System.out.println("密码:"+password);

System.out.println("爱好:"+ Arrays.asList(hobby));

}

}

4. 中文乱码

使用post请求的时候,如果用户名输入的是中文,则会出现中文乱码的情况,所以需要这样设置

public class ParameterServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// 在post的时候注意设置字符集,要不中文乱码

// 只有在获取请求参数调用之前使用才有效

req.setCharacterEncoding("UTF-8");

System.out.println("------------doPost--------------");

// 获取请求的参数

String username = req.getParameter("username");

String password = req.getParameter("password");

// String hobby = req.getParameter("hobby");

// 当有多个值的时候

String [] hobby = req.getParameterValues("hobby");

System.out.println("用户名:"+username);

System.out.println("密码:"+password);

System.out.println("爱好:"+ Arrays.asList(hobby));

}

}

5. 请求转发

什么是请求的转发?

请求转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发

请求转发的特点:

浏览器地址栏没有改变

一次请求

共享Request域中的数据

可以转发到WEB-INF目录下

不可以访问工程以外的资源

bed121ffecabea2c1ae47ba8bd38214f.png

例子如下:通过访问Servlet1然后转发到Servlet2去

public class Servlet1 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// http://localhost:8080/04_Servlet/servlet1?username=abc

// 1. 获取请求的参数

String username = req.getParameter("username");

System.out.println("在Servlet1中获取到的请求参数:"+username);

// 在Servlet1中获取到的请求参数:abc

// 2. 把获取到的数据传递,也可以自定义参数传递

// req.setAttribute("username" , username);

req.setAttribute("key","我来自Servlet1");

// 3. 转发

// 地址必须以 /开头 ,这个地址也是在web.xml中配置对应的你要去的

RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

requestDispatcher.forward(req,resp);

// 或者可以直接这样

req.getRequestDispatcher("/servlet2").forward(req,resp);

}

}

对应的web.xml就不展示了,都类似

/**

* @author MD

* @create 2020-07-25 8:57

*/

public class Servlet2 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// 1. 获取请求的参数

String username = req.getParameter("username");

System.out.println("在Servlet2中获取到的请求参数:"+username);//在Servlet2中获取到的请求参数:abc

// 2. 查看从Servlet1中传递的参数

Object key = req.getAttribute("key");

System.out.println("Servlet1中传来的参数:"+key);//Servlet1中传来的参数:我来自Servlet1

// 3. 处理自己的业务

System.out.println("正在处理Servlet2的业务");//正在处理Servlet2的业务

}

}

6. base标签

54780438c43da334b2b3bd4260f7603d.png

所以在html文件中,跳转的时候若使用相对路径,指定相对的那个路径

Title

这是a目录下的b目录下的c.html页面

跳到首页

开发中尽量使用绝对路径,实在不行就使用base+相对路径

7. web中 / 斜杠的不同意义

在web中 / 是一种绝对路径

/ 斜杠被浏览器解析,得到的地址就是 http://ip:port

斜杠

/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径

/servlet1

servletContext.getRealPath(“/”);

request.getRequestDispatcher(“/”);

特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/

二、HttpServletResponse 类

1. HttpServletResponse 类的作用

HttpServletResponse 类和 HttpServletRequest 类一样。

每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,

我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置

2. 两个输出流

字符流

getWriter()

用于传字符串(常用)

字节流

getOutputStream()

用于下载(传递二进制数据)

3. 如何往客户端回传数据

首先还是先建立一个servlet,配置对应的web.xml

注意中文的乱码情况

package com.md.servlet;

/**

* @author MD

* @create 2020-07-25 9:57

*/

public class ResponseIOServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// System.out.println(resp.getCharacterEncoding());//ISO-8859-1

//

// // 设置服务器字符集为

// resp.setCharacterEncoding("UTF-8");

// // 此时若浏览器没有使用UTF-8中文还是乱码,这个时候需要

// // 通过设置响应头,使得浏览器也使用UTF-8字符集

// resp.setHeader("Content-Type","text/html; charset=UTF-8");

// 或者直接可以这样写,自动设置服务器字符集和浏览器响应头

// 方法一定要流获取之前先调用,通常放在最上面就行

resp.setContentType("text/html; charset=UTF-8");

// 需求:往客户端回传字符串数据

PrintWriter writer = resp.getWriter();

writer.write("response");

writer.write("越过山丘,");

}

}

4. 请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)

请求重定向的特点:

浏览器的地址会发生改变

两次请求

不能共享Request域中的数据

不能访问WEB-INF下的资源

可以访问工程外的资源

0f2bcdf7a34064d62d750d348a84225a.png

例子如下:访问Response1重定向到Response2

/**

* @author MD

* @create 2020-07-25 10:15

*/

public class Response1 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("Response 1 ");

// // 设置响应状态码,表示重定向

// resp.setStatus(302);

//

// // 设置响应头,说明新的地址,和web.xml里的要对应

// resp.setHeader("Location","http://localhost:8080/04_Servlet/response2");

// 推荐使用

resp.sendRedirect("http://localhost:8080/04_Servlet/response2");

}

}

//-----------------------------------

public class Response2 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("Response 2 ");

resp.getWriter().write("Response2 result !");

}

}

对应的web.xml

Response1

com.md.servlet.Response1

Response1

/response1

Response2

com.md.servlet.Response2

Response2

/response2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值