JavaWeb - ServletContext
ServletContext
web 容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表当前的web应用
1.共享数据
我再当前Servlet中保存的数据可以在另一个servlet中拿到
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
// this.getInitParameter()
// this.getServletConfig()
// this.getServletContext()
/*
* ServletContext
* web 容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表当前的web应用
* 共享数据 -> 我再当前Servlet中保存的数据可以在另一个servlet中拿到
* */
ServletContext servletContext = this.getServletContext();
String username = "meng";
servletContext.setAttribute("username", username); // 将一个数据保存在servlet中
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String string = (String) servletContext.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(string);
System.out.print(string);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
hello
com.meng.servlet.Test
hello
/hello
GetServlet
com.meng.servlet.GetServlet
GetServlet
/GetServlet
2.获取初始化参数
url
666six
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
}
}
3.请求转发
forward
com.meng.servlet.GetServlet
forward
/forward
// 路径不变 内容转发
public class ServletForward extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.getRequestDispatcher("/hello").forward(req, resp);
}
}
4.读取资源文件
Properties
-
在java目录下新建Properties
src/main/resources **/*.properties **/*.xml true src/main/java **/*.properties **/*.xml true -
在resource目录下新建Properties
发现: 都被打打包到了同一个路径下: classes,我们俗称这个路径为classpath;
pt
com.meng.servlet.PropertiesServlet
pt
/pt
public class PropertiesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(inputStream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.getWriter().print(username);
resp.getWriter().print(password);
}
}
HTTPServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HTTPServletRequest对象,代表响应一个HTTPServletResponse;
- 如果要获取客户端请求过来的参数:HTTPServletRequest
- 如果要给客户端响应一些信息:HTTPServletResponse
HTTPServletResponse 下载文件
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.要获取下载文件的路径
String realPath = "D:\\IdeaProjects\\untitled11\\untitled\\untitled11\\javaweb-servlet\\response\\target\\classes\\1.png";
System.out.println("下载文件的路径为:" + realPath);
//2.下载的文件名字是什么
String fileName = realPath.substring(realPath.lastIndexOf("//") + 1);
//3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西
resp.setHeader("Content-Disposition","attachment;filename=" + fileName);
//4.获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5.创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6.获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
//7.将FileOutputStream流写入到缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
while ((len = in.read(buffer)) > 0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
}
HTTPServletResponse验证码
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3s刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D g = (Graphics2D) image.getGraphics(); //这是一只笔,可以画图
//设置图片的背景颜色
g.setColor(Color.white);
g.fillRect(0,0,80,20);
//给图片写数据
g.setColor(Color.BLUE);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeNum(),0,20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpg");
//网站存在缓存,不让浏览器环存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");//缓存控制,不缓存
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image, "jpg",resp.getOutputStream());
}
//生成随机数
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999999) + "";//代表7位数的验证码
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
sb.append("0");
}
String s = sb.toString() + num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
HTTPServletResponse重定向
resp.sendRedirect("/r/img");
原理
response.setHeader("Location", "/Day06_01/Csertlet");
response.setStatus(302);
重定向和转发的区别?
相同点:页面都会跳转
不同点:
-
请求转发的时候URL不会发生变化 307
-
重定向的时候URL会变化 302
HTTPServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
二、Request常用方法
2.1、获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于 Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr方法返回发出请求的客户机的IP地址。
getRemoteHost方法返回发出请求的客户机的完整主机名。
getRemotePort方法返回客户机所使用的网络端口号。
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名。
范例:通过request对象获取客户端请求信息
/**
* @author gacl
* 通过request对象获取客户端请求信息
*/
public class RequestDemo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.获得客户机信息
*/
String requestUrl = request.getRequestURL().toString();//得到请求的URL地址
String requestUri = request.getRequestURI();//得到请求的资源
String queryString = request.getQueryString();//得到请求的URL地址中附带的参数
String remoteAddr = request.getRemoteAddr();//得到来访者的IP地址
String remoteHost = request.getRemoteHost();
int remotePort = request.getRemotePort();
String remoteUser = request.getRemoteUser();
String method = request.getMethod();//得到请求URL地址时使用的方法
String pathInfo = request.getPathInfo();
String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址
String localName = request.getLocalName();//获取WEB服务器的主机名
response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
response.setHeader("content-type", "text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.write("获取到的客户机信息如下:");
out.write("
");
out.write("
");
out.write("请求的资源:"+requestUri);
out.write("
");
out.write("
");
out.write("来访者的IP地址:"+remoteAddr);
out.write("
");
out.write("来访者的主机名:"+remoteHost);
out.write("
");
out.write("使用的端口号:"+remotePort);
out.write("
");
out.write("remoteUser:"+remoteUser);
out.write("
");
out.write("请求使用的方法:"+method);
out.write("
");
out.write("pathInfo:"+pathInfo);
out.write("
");
out.write("localAddr:"+localAddr);
out.write("
");
out.write("localName:"+localName);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.2、获得客户机请求头
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法
范例:通过request对象获取客户端请求头信息
public class RequestDemo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
//通过设置响应头控制浏览器以UTF-8的编码显示数据
response.setHeader("content-type", "text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Enumeration reqHeadInfos = request.getHeaderNames();//获取所有的请求头
out.write("
");
while (reqHeadInfos.hasMoreElements()) {
String headName = (String) reqHeadInfos.nextElement();
String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值
out.write(headName+":"+headValue);
out.write("
");
}
out.write("
");
out.write("获取到的客户端Accept-Encoding请求头的值:");
out.write("
");
String value = request.getHeader("Accept-Encoding");//获取Accept-Encoding请求头对应的值
out.write(value);
Enumeration e = request.getHeaders("Accept-Encoding");
while (e.hasMoreElements()) {
String string = (String) e.nextElement();
System.out.println(string);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.3、获得客户机请求参数(客户端提交的数据)
- getParameter(String)方法(常用)
- getParameterValues(String name)方法(常用)
- getParameterNames()方法(不常用)
- getParameterMap()方法(编写框架时常用)
比如现在有如下的form表单
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
Html的Form表单元素