学习Servlet3

HttpServletRequest
        
        每次只要有请求进入 Tomcat 服务器, Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法( doGet doPost )中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
HttpServletRequest 类的常用方法 (req.)
i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
表单提交时或者浏览器输入栏中的参数键值对【http://localhost:8080/07_servlet/servlet1?username=lkj123】,能够获取key对应的value。另外还有表单内元素的值[比如当你在输入框里面输入内容,那么就可以通过以下方法获取到]:
v. getParameter() 获取请求的参数 
vi. getParameterValues() 获取请求的参数(多个值的时候使用)

举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    如何获取请求参数-->
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="java">java
    <input type="checkbox" name="hobby" value="js">javascript
    提交:<button type="submit"></button>
</form>
</body>
</html>
public class ParameterServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req.getParameter("username"));
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.asList(hobbies));

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在doPost请求中要注意当文本框中的内容为中文时,那么获取文本框中的内容时,要在所有获取请求的参数的方法上面写上
        //req.setCharacterEncoding("UTF-8"); 否则会出现乱码问题
        req.setCharacterEncoding("UTF-8");

        System.out.println(req.getParameter("username"));
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.asList(hobbies));
    }
}
vii. getMethod() 获取请求的方式 GET 或 POST 

下面这些方法可以应用在请求转发中

viii. setAttribute(key, value); 设置域数据    servletContext类中也有该方法。
ix. getAttribute(key); 获取域数据  servletContext类中也有该方法。
x. getRequestDispatcher() 获取请求转发对象
请求的转发
        服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
在实际开发中,可能需要多个servlet程序来完成一个业务。那么我们希望我们在客户端(浏览器),只输入一个地址就可以完成这个业务
* 但是之前我们学的servlet程序都有一个地址来对应访问他(web.xml中的<servlet-mapping>设置)。所以我们需要请求转发。一次请求,
* 访问多个servlet程序
*
* 那么该怎么进行请求转发呢?
*     首先在直接请求的servlet1程序中要做的事:
*           1.获取请求参数
*           2.盖章
*           3.去向servlet2,先问路
*           4.走到servlet2
*     在转发请求的servlet2程序中要做的事:
*           1.同样是获取请求参数
*           2.检查servlet1中的章
*           3.处理自己的业务
请求转发代码示例:
 
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求参数
        String username = req.getParameter("username");
        System.out.println(username);

        //2.盖章
        req.setAttribute("key","servlet1的章");

        //3.问路 / 对应部署后的module下的web目录,src下的内容也放在web目录下的classes文件夹下的,你要访问src写的.java程序就直接/+程序名
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

        //4.走到servlet2
        requestDispatcher.forward(req,resp);
    }
}
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(username);

        //2.检查servlet1的章
        Object key = req.getAttribute("key");
        System.out.println("servlet1是否有章:"+key);

        //3.处理自己的业务
        System.out.println("servlet2处理自己的业务");
    }
}

 base 标签的作用[应用在请求转发中]:

 Web 中的相对路径和绝对路径:

web / 斜杠的不同意义

 

HttpServletResponse 类:

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

* 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
*
*两个输出流的说明:
*       字节流 getOutputStream(); 常用于下载(传递二进制数据)
*       字符流 getWriter(); 常用于回传字符串(常用)
*       两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
*
* 如何往客户端回传数据:
*       PrintWriter writer = resp.getWriter();
*       writer.write("response's content!!!");
*
* 响应的乱码解决:
*       方案一(不推荐使用):
*           // 设置服务器字符集为 UTF-8
*           resp.setCharacterEncoding("UTF-8");
*           // 通过响应头,设置浏览器也使用 UTF-8 字符集
*           resp.setHeader("Content-Type", "text/html; charset=UTF-8");
*
*       解决响应中文乱码方案二(推荐):
*           // 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
*           // 此方法一定要在获取流对象之前调用才有效
*               resp.setContentType("text/html; charset=UTF-8");
*
* 请求的乱码问题:
*       只在dopost请求中会有中文乱码问题。
*           在所有获取参数的方法前加上该代码req.setCharacterEncoding("UTF-8"); 否则会出现乱码问题

请求重定向:

        请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求
重定向(因为之前的地址可能已经被废弃)。
* 请求重定向的特点:
*   1.浏览器中的地址会发生变化
*   2.因为进行了两次请求
*   3.不共享Request域数据,因为一次是一个对象
*   4.不能访问web-inf下的资源(受保护)
*   5.可以访问工程外的资源
*
* 请求重定向与请求转发的区别:
*   重定向,其实是两次request,
    第一次,客户端request   A,服务器响应,并response回来,告诉浏览器,你应该去B。
    这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
    请求转发是服务器内部把对一个request/response的处理权,移交给另外一个servlet程序
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。
public class RedictServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("本网站已废弃,返回新地址,由浏览器自动发起二次请求,前往新地址中");

        //设置章,但是由于请求重定向是两次请求,而每一次请求都有一个封装http请求的对象,但是每次请求该对象不一样
        //由于请求重定向是两次访问服务器,那么每次请求对象都不一样,所以我在servlet2中就得不到设置的该属性
        //但是在请求转发中我们是只经过了一次请求,地址栏的地址没有发生变化,所以只有一份req对象,所以可以拿到那个章
        req.setAttribute("key1","value1");

        //设置请求重定向
//        resp.sendRedirect("http://localhost:8080/07_servlet/servlet2");

        //重定向实现访问web工程外的资源,但是web-inf下的文件不能访问
        resp.sendRedirect("https://baidu.com");
    }

}
public class RedictServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //是拿不到key1的值。因为不是一个req对象
        System.out.println(req.getAttribute("key1"));

        resp.getWriter().write("response2 result");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值