Servlet详解(3)-使用全解析

1. HttpServletRequest类基础方法记录

  1. request对象可以获得许多的东西,如下:
方法 获得的东西
getRequestURL() 获得客户端的URL
getMethod() 这个是获取get/post方法
getRemoteHost() 获得客户端的IP地址
getHeader() 获得请求头
getParameter() 获取从从客户端传输过来的数据,参数为String,通过键值对取值
setCharacterEncoding() 设置字符集格式,其中的参数是String类型的,用在获取客户端数据之前
getParameterValues() 取得某个类型的多个数据,参数也是String类型

  1. 请求转发
    在有些时候可能需要几个Servlet同时处理某个业务,这时可能就需要用到请求转发,因为处理的时候是直接从一个Servlet到达另一个Servlet,以下记录这些常用的方法;
    第一个Servlet:
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //先定义好接收的数据类型
        request.setCharacterEncoding("UTF-8");
        //获得来自于客户端的数据
        String name = request.getParameter("user");
        //打印输出一下
        System.out.println(name);
        //这里可以写Servlet1对业务的处理逻辑,也可以将处理逻辑通过setAttribute传到第二个Servlet;
        //设置Request域的值,可以在整个Servlet里面进行传输;
        request.setAttribute("key1", "已经经过第一个Servlet");
        //创建一个RequestDispatcher对象,用来表示第二个Servlet的映射路径;
        RequestDispatcher reqDis = request.getRequestDispatcher("/fourth");
        //这个就是一个跳转
        reqDis.forward(request, response);
    }

第二个Servlet:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //在这里可以获得第一个Servlet中传递过来的数据;
        String Key1 = (String) request.getAttribute("key1");
        System.out.println(Key1);
        //当然也可以和第一个Servlet一样可以获得来自客户端的数据
        String password = request.getParameter("password");
        System.out.println(password);
        //底下可以写在Servlet2中对业务的处理逻辑;
        System.out.println("Servlet2处理完毕");
    }

当数据提交到第一个Servlet之后,在控制台的输出结果;

请求转发的几个特点:1.跳转Servlet不改变地址栏;2.虽然跳转了Servlet,但实际上它们是一次请求;3.它们可以通过Request域来共享数据;4.它们最大的特点是可以访问到WEB-INF里面的资源,实际上,无法在浏览器中直接访问这个文件夹中的资源;5.缺点就是,所有的资源使用的都是在当前工程下,无法跳出已有的工程,去访问工程外部的资源;

界面应该都是放在web目录下;


  1. base标签的使用
    base标签设置的是页面相对路径工作时参照的地址;(一般的相对路径都是取决于当前页面的路径作为相对路径的依据,)
    base标签的使用位置是放在head 标签里面;
    首先:给个起始的目录

    如过通过servlet中的请求转发进行页面的跳转,跳转(使用相对路径)之后很容易出现找不到资源,也就是路径错误;
    如下:Servlet程序
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("已经进入了Servlet");
        //通过这行代码,进行跳转;
        req.getRequestDispatcher("../Html/TestA.html").forward(req, res);
    }


在href属性中输入的路径,显示协议,IP地址,端口号,当前工程路径,当前资源目录;


  1. 在Servlet中如何传递数据到客户端?
    1. 通过字节流,方法是getOutputStream();用于传送文件等;
    2.通过字符流,方法是getWriter();常用于发送字符串;
    这里需要注意的点就是,传递数据时,只能使用一种方法(要么使用字节流,要么使用字符流),不能同时使用两种,仔细一想,你同时使用两种方法的话,客户端该怎么区分,怎么接受;
      //通过设置响应头,使得浏览器也使用自己设置的UTF-8;避免乱码;获取流之前才有效,也就是在调用getWriter方法之前;
        resp.setHeader("Content-type","text/html;charset=utf-8");
        PrintWriter wrt = resp.getWriter();
        wrt.write("测试getWriter方法");
        //还有print方法也可以;
        wrt.print("测试getWriter方法");
    

  1. Servlet中的请求重定向
    简单来说:是指在客服端向服务器发送请求之后,服务器将一个可以完成客户端的要求的新地址发给客户端,叫客户端去访问;
    其中需要用到的参数有响应码和Location(新URL地址),也是直接跳转;
    与Servlet中的请求转发区别:
    • 浏览器地址发生改变;
    • 需要进行两次请求;
    • 不共享request域中的数据(在我理解看来,就是它其实是通过服务器重新连接一个后台的Servlet,所有无法共享request域数据);
    • 可以访问工程外的资源;
      //设置状态码,必须要设置
       response.setStatus(301);//可以301,也可以302
       //用于创建一个跳转的网址; 
       response.setHeader("Location", "http://www.baidu.com");

在JavaWeb中的重定向中,除了上面这一种方法,还可以直接使用sendRedirect()方法;

Java杂记

1. 在Java中路径../表示上一级目录;例如:

以上面目录作为基础时,当前目录如果在TestBase.jsp中时,需要访问到TestA.html文件时,则需要的路径就是(../Html/TestA.html)

2. 在javaweb的浏览器中,/代表的是根路径(http://IP地址:端口号);在服务器中,也就是可以简单的理解为在Servlet,/代表(http://IP地址:端口号/工程路径);工程路径可以简单的理解为你在IDEA中的那个Modul名,一般可以自己修改(之前记录过,不过多赘述);

3. 一般情况下,浏览器的默认编码是GBK;

4. 响应码302是指临时性的重定向(并非永远都是那个重定向的URL,可能会修改),301是永久的重定向;

猜你喜欢

转载自blog.csdn.net/dxsdcyy/article/details/107543850