
- getMethod();获取请求方式
- getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)
- getContextPath(); 获得当前应用工程名(部署的路径);
- getRequestURI();获得请求地址,不带主机名
- getRequestURL();获得请求地址,带主机名
- getHeader(String name);
- User-Agent: 浏览器信息
- Referer:来自哪个网站(防盗链)
-
getParameter(name):获取指定单个参数
-
getParameterValues(name):同时指定多个参数
-
getParameterMap():获取所有参数
-
setCharacterEncoding(“UTF-8”):解决请求乱码问题
@WebServlet("/request_01")
public class HttpRequest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//获取一个请求参数
String username = request.getParameter("username");
System.out.println(username);
//获取多个请求参数
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//获取所有请求参数
Map parameterMap = request.getParameterMap();
for (Map.Entry entry : parameterMap.entrySet()) {
System.out.println(entry.getKey());
System.out.println(Arrays.toString(entry.getValue()));
}
}
}
3.2 使用BeanUtils封装
将获取的参数封装成一个类的成员属性
参数类
public class User implements Serializable {
private String username;
private String password;
private String[] hobby;
private String age;
getter();
setter();
@Override
public String toString() {
return "User{" +
"username='" + username + ''' +
", password='" + password + ''' +
", hobby=" + Arrays.toString(hobby) +
", age='" + age + ''' +
'}';
}
}
Servlet
@WebServlet("/beanutils")
public class UtilsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map parameterMap = request.getParameterMap();
User user = new User();
try {
//调用接口进行封装
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
}
}
4. 请求转发
4.1 跳转
在当前页面显示要跳转页面的内容,但只访问了当前Servlet一次
getRequestDispatcher("/路径").forward(request, response);
4.2 作为域对象
设置和获取属性,但只能访问一次。因此若再一个Servlet1中使用了设置,再访问另一个Servlet1中是无法获得值的,因为相当于Servlet1和Servlet各访问了一次共访问了两次
因此当request作为域对象时,需要与跳转相结合
void setAttribute(String name, Object o); Object getAttribute(String name);
设置值
@WebServlet("/dispatcher")
public class DispatcherServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name", "jay");
request.getRequestDispatcher("/getattr").forward(request, response);
}
}
获取值
@WebServlet("/getattr")
public class GetAttrServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String) request.getAttribute("name");
System.out.println(name);
}
}
二、Response
1. 响应行
响应行代表客户端访问的结果状态,常见的响应状态码
- 200 成功
- 302 重定向
- 304 读缓存
- 404 客户端错误
- 500 服务器错误
相关API:public void setStatus(int sc);:设置响应状态码
response.setStatus(403);2. 响应头 2.1 常见响应头
响应头是服务器指示浏览器去做什么
public void setHeader(String name, String value);:设置响应头
-
一个Key对应一个Value
-
一个Key对应多个Value
常用的响应头
- Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)
- Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)
- Content-Disposition: 告诉浏览器下载
- Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)
**response.setHeader(“refresh”,“秒数;url=跳转的路径”); **:几秒之后跳转到指定的路径上
response.setHeader("Refresh","3;url=https://www.baidu.com"); //3s后跳转到百度
2.2 重定向
response.setHeader(“Location”, 重定向地址)
//1.设置状态码
response.setStatus(302);
//2.设置重定向的路径(绝对路径,带域名/ip地址的,如果是同一个项目里面的,域名/ip地址可以省略)
response.setHeader("Location","http://localhost:8080/day28/demo08");
response.setHeader("Location","/day28/demo08");
response.setHeader("Location","http://www.baidu.com");
response.sendRedirect(“重定向地址”);:封装了设置状态码和重定向两个功能
response.sendRedirect("http://localhost:8080/day28/demo08");
2.3 重定向与请求转发
- 重定向的跳转是由浏览器发起的,且会发起两次请求,因此浏览器地址栏会变;请求转发是由服务器发起的,浏览器只请求了一次,因此浏览器地址栏不会变。
- 重定向时浏览器可以跳转到任意服务器资源,但不能访问服务器的WEB-INF中的资源;请求转发时浏览器可以访问包括web-INF中的任意资源,但无法跳转到别的服务器
- 重定向是response行为,无法使用request的域对象;请求转发是request行为,可以直接使用域对象。
相应 *** 作体的API,页面输出只能使用其中的一个流实现,两个流是互斥的.
3.1 字符输出流public PrintWriter getWriter() throws IOException;
- getWriter().write()输出字符串
- getWriter().print()既能输出字符串也能输出非字符串
@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
...
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置服务器的响应字符集,避免乱码
response.setContentType("text/html;charset=UTF-8");
//要向浏览器输出响应体的信息,需要通过流来进行 *** 作
//第一种:字符串,输出文本内容
PrintWriter writer = response.getWriter();
//使用字符流往浏览器输出文本
//1. writer()方法,只能输出字符串,如果输出int、float等等类型的话,则会有问题
writer.write("你好世界");
//2. print()方法,可以输出数字、字符串
writer.print(8);
}
}
3.2 字节输出流
字节输出流可以向浏览器输出任意类型资源
public ServletOutputStream getOutputStream() throws IOException;
@WebServlet("/demo05")
public class ServletDemo05 extends HttpServlet {
...
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 读取b.jpg图片,将其转换成字节输入流,使用ServletContext
ServletContext servletContext = getServletContext();
InputStream is = servletContext.getResourceAsStream("b.jpg");
//2. 使用字节输出流,将is中的字节都输出到浏览器
ServletOutputStream os = response.getOutputStream();
//注意:需要引入commons-io的jar包
IOUtils.copy(is,os);
os.close();
is.close();
}
}
三、路径问题
1. URL
URL组成部分
- 协议 http://
- 服务器主机地址 localhost
- 服务器端口号 :8080
- 项目的虚拟路径(部署路径) responseDemo
- 项目上的具体资源路径 /pages/hello.html或/demo02(servlet映射路径)
使用完整URL场景
- 浏览器地址栏直接访问
- 当前项目访问另一个项目的资源
绝对路径:
- 请求转发只能访问项目内资源,因此即便写绝对路径也可以省略项目路径,如"/hello.html"
- 非请求转发的绝对路径写法"/项目部署路径/资源路径" 例如"/responseDemo/hello.html"
相对路径:
不以"/"开头的路径写法,它是以目标路径相对当前文件的路径,如
四、文件下载实例通过超链接方式下载(不推荐)
即将要下载的文件路径写到href属性中,如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了
通过响应头指定浏览器下载
Content-Disposition: 告诉浏览器下载
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
...
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取要下载的文件名
String filename = request.getParamter("filename");
//2.获取下载文件的流信息
InputStream is = request.getServletContext().getResourceAsStream("file/"+filename);
//2.设置mimetype文件头
String mimetype = request.getServletContext().getMimeType(file);
response.setHeader("Content-Type",mimeType);
//4.设置下载的响应头
//对文件名进行utf8编码避免乱码
String ecodeFIlename = URLEcoder.encode(filename, "UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+encodeFileName);
//5.输出流数据
ServletOutputStream os = response.getOutputStream();
IOUtils.copu(is, os);
//6.关闭资源
is.close();
os.close();
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)