JavaWeb(Servlet)


很详细的一篇博客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下载文件

javaWeb项目-文件下载的消息头和编码问题
重点

		//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>

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值