文章目录
很详细的一篇博客JavaWeb——Servlet(全网最详细教程包括Servlet源码分析),下面只做一些补充。
1.ServletContext对象
- web容器启动时会为每个web程序创建一个对应的ServletContext对象,它代表了当前的web应用。
- 有了ServletContext对象,就可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象。
- 一个web应用下可以有多个servlet,而通过ServletContext可以共享各个servlet中的数据。
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();//获得ServletContext对象
String name = "kk";
context.setAttribute("username",name);
//将数据保存在ServletContext中,以k-v形式存储,即username-"kk"
//利用ServletContext对象读取资源文件 500错误(原因:类路径写错)
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//类路径
Properties prop = new Properties();
prop.load(in);
String username = prop.getProperty("username");
String pwd = prop.getProperty("pwd");
resp.getWriter().println(username+" "+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
通过ServletContext对象获得数据,注意要先访问HelloServlet(/hello)存入数据,然后在访问GetServlet(/context)显示数据,web.xml配置就不多说了
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
//resp.setContentType("text/html;charset=utf-8");
resp.setHeader("Content-Type","text/html;charset=utf-8");//防止乱码
resp.getWriter().println("用户名"+username);
//要先访问HelloServlet(/hello)存入数据,然后在访问GetServlet(/context)显示数据
}
}
2.HttpServletResponse和HttpServletRequest接口
2.1 Response下载文件
//3.设置下载文件响应头
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName,"UTF-8"));//URLEncoder.encode防止文件名为中文时,下载处的文件名变为__.jpg
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取下载文件路径
String realPath = "E:\\ProgramLearning\\java学习\\JAVA\\javaweb-servlet-1\\response\\target\\classes\\背景.jpg";//应在target文件夹下找
System.out.println("要下载的文件路径"+realPath);
//2.获取下载文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3.设置下载文件响应头
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName,"UTF-8"));//URLEncoder.encode防止文件名为中文时,下载处的文件名变为__.jpg
//4.获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5.创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6.获取输出流对象
ServletOutputStream out = resp.getOutputStream();
//7.将缓冲区内容输出到客户端
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
//别忘了在web.xml注册servlet
//进入指定url路径后,会自动弹出下载界面
}
2.2 Response重定向
public class Redirect extends HttpServlet { // url请求路径/d/redir
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/d/img");
}
}
原理如下图
测试结果
审查元素看看更好理解
所以resp.sendRedirect("/d/img");这行代码等价于:
resp.setHeader("Location","/d/img");
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);// 即302
public interface HttpServletResponse extends ServletResponse 中的一些常量
重定向和请求转发的区别
先看看转发的原理图:
- 首先,重定向和转发都会使页面发生跳转
- 但二者区别在于
- 转发时url不会变化,即request.getRequestDispatcher().forward(),是一种服务器的行为,客户端只有一次请求,307
- 重定向时url会变化,即response.sendRedirect(),是一种客户端行为,本质上讲等同于两次请求 ,302
使用重定向使jsp页面跳转
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
//重定向
resp.sendRedirect("/d/success.jsp");
//请求转发 注意路径的区别 这里“/”表示当前项目
//req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理Post请求");
}
}
index.jsp
<%@ page contentType="text/html; charset=utf-8" language="java"%>
<html>
<body>
<%--${pageContext.request.contextPath}括号里这段java代码代表当前项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名 <input type="text" name="username"> <br>
密 码 <input type="password" name="pwd"> <br>
<input type="submit">
</form>
</body>
</html>