Servlet第三天Request

1.HttpServletRequest

  1.获取客户机信息:

•getRequestURL方法返回客户端发出请求时的完整URL。
•getRequestURI方法返回请求行中的资源名部分。
•getQueryString 方法返回请求行中的参数部分。
•getRemoteAddr方法返回发出请求的客户机的IP地址
•getRemoteHost方法返回发出请求的客户机的完整主机名
•getRemotePort方法返回客户机所使用的网络端口号
•getLocalAddr方法返回WEB服务器的IP地址。
•getLocalName方法返回WEB服务器的主机名
//获取请求信息
public class RequestTest extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取请求方式
        System.out.println(request.getMethod());
        // 获取请求URI
        System.out.println(request.getRequestURI());// /day06/RequestTest
        // 获取URL
        System.out.println(request.getRequestURL());// http://localhost/day06/RequestTest
        // 获取web应用名
        System.out.println(request.getContextPath());// /day06
        // 获取访问者IP
        System.out.println(request.getRemoteAddr());
        // 访问主机
        System.out.println(request.getRemotePort());
        // 获取端口号
        System.out.println(request.getRemotePort());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

2.获取客户机请求头

•getHeader(string name)方法
•getHeaders(String name)方法
•getHeaderNames方法  获得所有的头的key
public class RequestTest2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        test_1(request);
    }

    // 获取头相关方法
    private void test_1(HttpServletRequest request) {
        String headValue = request.getHeader("Accept-Encoding");
        System.out.println(headValue);
        System.out.println("-------分隔符----------");
        Enumeration<String> e = request.getHeaders("Accept-Encoding");
        while (e.hasMoreElements()) {
            System.out.println(e.nextElement());
        }
        System.out.println("-------分隔符----------");
        // 获取所有头的名字
        e = request.getHeaderNames();
        while (e.hasMoreElements()) {
            String name = e.nextElement();
            String value = request.getHeader(name);
            System.out.println(name + "=" + value);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
3.获得客户机请求参数(客户端提交的数据)
•getParameter方法
•getParameterValues(String name)方法
•getParameterNames方法   内省  BeanUtils
•getParameterMap方法

上传文件使用流获取数据在后面将会学习到

注意使用BeanUtils需要导入commons-beanutils-1.8.jar和commons.logging-1.1.1.jar两个包
/**
 * 获取提交数据 获取数据时,要先检查再再使用
 * 
 * @author malinkang
 * 
 */
public class RequestTest3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取数据方式1:根据名字获取值
        String value = request.getParameter("username");
        // 判断是否为空或空格
        if (value != null && !value.trim().equals("")) {
            response.getWriter().write(value + "<br/>");
        }

        // 获取数据方式2:
        Enumeration<String> e = request.getParameterNames();
        while (e.hasMoreElements()) {
            String name = e.nextElement();
            String value_2 = request.getParameter(name);
            response.getWriter().write(value_2 + "<br/>");
        }
        // 获取数据方式3:
        // 当有多个username使用getParameterValues方法
        String[] values = request.getParameterValues("username");
        // 获取数据时,要先检查再再使用
        for (int i = 0; values != null && i < values.length; i++) {
            response.getWriter().write(values[i] + "<br/>");
        }
        // 获取数据方式4:
        Map<String, String[]> map = request.getParameterMap();
        User user = new User();
        try {
            // 用map数据填充Bean
            BeanUtils.populate(user, map);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        System.out.println(user);
        // User [password=dasfas, username=[asdf, sadfasd]]

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);

    }

}

JavaBean

public class User {
    private String[] username;
    private String password;

    public String[] getUsername() {
        return username;
    }

    public void setUsername(String[] username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [password=" + password + ", username="
                + Arrays.toString(username) + "]";
    }
}

获取数据中文乱码解决方案:

提交数据两种方式1.Post方式提交(表单提交):设置字符编码

2.Get方式提交(超链接提交):不能采用设置字符编码来解决;可通过以下方式解决:1.将获取数据先编码再解码;2.修改服务器配置(不建议)3.通过URLEncoding编码解决

<a href="/.../Servlet?username<%=URLEncoder.encode("李四","UTF-8")%">提交</a>

/**
 * 中文乱码问题
 * 
 * @author malinkang
 * 
 */
public class RequestTest6 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String username = request.getParameter("username");
        // Get解决方案1
        // System.out.println(new String(username.getBytes("iso8859-1"),
        // "utf-8"));
        // 解决方案2使用URLEncoder.encode进行编码
        System.out.println(URLEncoder.encode(username, "utf-8"));
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // post提交可以通过设置字符编码解决
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        System.out.println(username);
    }

}


4.请求转发

Request对象实现请求转发:一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
 
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

setAttribute方法   设置或添加数据

getAttribute方法          获取数据

removeAttribute方法       删除数据

getAttributeNames方法  获取名称,用于迭代

/**
 * 请求转发
 * 
 * @author malinkang mvc (modle (javabean) view(jsp) cotroller(Servlet))
 */
public class ServletTest6 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String data = "hello";

        request.setAttribute("hello", data);

        RequestDispatcher dispatcher = request
                .getRequestDispatcher("/index.jsp");
        PrintWriter out = response.getWriter();
        out.write(data);
        dispatcher.forward(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

请求转发的一些细节:

  • 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到客户端,forward方法将抛出异常
  • 如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行。原来写入到输出缓冲区的内容将被清空,但是,已经写入的响应头字段信息保持有效。

5.请求包含

 

6.防盗链

/**
 * 防盗链
 * 
 * @author malinkang
 * 
 */
public class RequestTest7 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取头
        String referer = request.getHeader("referer");
        if (referer == null || referer.startsWith("http://localhost")) {
            // 跳转到首页
            response.sendRedirect("/day06/index.jsp");
            return;
        }
        response.getWriter().write("hello");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
原文地址:https://www.cnblogs.com/malinkang/p/2709536.html