JavaEE学习day-47:Servlet技术(2)

一、Request请求

1.request对象的介绍:

作用:

由服务器创建,用来储存请求的信息;

特点:

Request对象由服务器创建;一次请求创建一个对象,生命周期为一次请求内,请求结束即销毁此次请求的request对象。

2.Request对象获取请求数据的方法:

(1)request对象获取请求行的方法:
1)getMethod():返回请求方式;
2)getRequestUrl():返回请求url;
3)getRequestUri():返回请求uri;
4)getQueryString():返回get请求中的URL中的用户数据;
5)getSchema():返回协议;
(2)Request对象获取请求头的方法:
1)getHeader():根据键名获取请求头信息;

注意:如果获取的请求头信息不存在返回null。

2)getHeaderNames() 返回存储了请求头键名的枚举集合。
(3)Request对象获取请求实体数据的方法:
1)getParameter(String name):根据键名获取数据;

注意:
键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字。
如果请求中没有对应的请求数据,则返回null。

2)getParameterValues(String name):根据键名获取同名不同的值,返回数组;
3)getParameterNames():返回实体数据中键名的枚举;
(4)Request对象请求网络数据
1)getRemoteAddr():获取客户端的IP地址;
2)getRemotePort():取客户端端口号;
3)getLocalAddr():获取服务器端的ip;
4)getLocalPort():获取服务器端的端口号;

package com.zlw.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * * request对象学习之获取请求数据 请求数据: 
 *      请求行:请求方式 请求URL 协议 
 *            getMethod(); 返回请求方式
 *            getRequestUrl():返回请求url 
 *            getRequestUri():返回请求uri 
 *            getQueryString():返回get请求中的URL中的用户数据 注意:post请求中没有此方法。 
 *            getSchema(); 返回协议 
 *       请求头 
 *            getHeader(String name) 根据键名获取请求头信息 
 *       注意:如果获取的请求头信息不存在返回null。 
 *            getHeaderNames() 返回存储了请求头键名的枚举集合。
 *        请求实体
 *            getParameter(String name) 根据键名获取数据 
 *        注意:
 *          键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字 
 *          如果请求中没有对应的请求数据,则返回null.
 *          getParameterValues(String name) 根据键名获取同名不同的值,返回数组 
 *              注意:如果没有对应的键名,则返回null
 *          getParameterNames() 返回实体数据中键名的枚举 请求网络相关数据 
 *          getRemoteAddr() 获取客户端的IP地址
 *          getRemotePort() 获取客户端端口号 
 *          getLocalAddr() 获取服务器端的ip 
 *          getLocalPort() 获取服务器端的端口号
 * 
 * @author zhang
 *
 */
public class RequestServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取请求行信息
        //获取请求方式
        String method = req.getMethod();
        System.out.println("请求方式:"+method);
        //获取请求的URL信息
        StringBuffer requestURL=req.getRequestURL();
        System.out.println("请求URL:"+requestURL);
        //获取请求的URI信息
        String requestURI = req.getRequestURI();
        System.out.println("请求URI:"+requestURI);
        //获取get请求URL中的请求数据
        String queryString = req.getQueryString();
        System.out.println("获取get请求中的URL数据:"+queryString);
        //获取协议
        String scheme = req.getScheme();
        System.out.println("获取请求协议:"+scheme);
        
    //获取请求头信息
        //根据键名获取请求头信息
        String header=req.getHeader("User-Agent2");
        System.out.println("获取浏览器的版本信息:"+header);
        //获取请求头中键名的枚举
        Enumeration headerNames=req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            //获取请求头键名
            String name=(String)headerNames.nextElement();
            //获取请求头的键名对应的值
            String value=req.getHeader(name);
            System.out.println(name+":"+value);
        }
    //获取请求实体数据(用户数据)
        //根据键名获取数据
        String uname = req.getParameter("uname2");
        String pwd = req.getParameter("pwd");
        System.out.println("请求实体数据:"+uname+":"+pwd);
        //获取请求实体中键名的枚举
        Enumeration names= req.getParameterNames();
        while(names.hasMoreElements()){
            //获取键名
            String name=(String)names.nextElement();
            //判断
            if("fav".equals(name)){
                String [] favs2 = req.getParameterValues(name);
                if(favs2!=null){
                    for(String s:favs2){
                        System.out.println(name+":"+s);
                    }
                }
            }else{
                //获取值
                String value=req.getParameter(name);
                System.out.println(name+":"+value);
            }
        }
    //请求相关的网络数据
        //获取客户端信息
        String remoteAddr = req.getRemoteAddr();
        System.out.println("获取客户端的ip::"+remoteAddr);
        //获取客户端的端口号(浏览器)
        int remotePort = req.getRemotePort();
        System.out.println("获取客户端的端口号:"+remotePort);
        //获取服务器主机的ip
        String localAddr = req.getLocalAddr();
        System.out.println("获取服务器ip:"+localAddr);
        //获取服务器的端口号
        int localPort= req.getLocalPort();
        System.out.println("获取服务器端口号:"+localPort);
    //处理请求信息
    //响应处理结果
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>RequestServlet</servlet-name>
    <servlet-class>com.zlw.servlet.RequestServlet</servlet-class>
  </servlet>
<servlet-mapping>
    <servlet-name>RequestServlet</servlet-name>
    <url-pattern>/requset</url-pattern>
  </servlet-mapping>
</web-app>
结果

二、Response响应

1.服务器接收和响应请求数据:

(1)接收浏览器的请求数据:
服务器接收到浏览器的请求后,会创建一个 Request 对象,对象中存储了此次请求相关的请求数据。服务器在调用 Servlet 时会将创建的Request 对象作为实参传递给 Servlet 的方法,比如:service 方法。

1)获取请求头数据 ;
2)获取请求行数据 ;
3)获取用户数据 ;

(2)响应请求数据:
服务器在调用指定的 Servlet 进行请求处理的时候,会给 Servlet 的方法传递两个实参 request 和 response。其中 request 中封存了请求相关的请求数据,而 response 则是用来进行响应的一个对象。

1)设置响应头;
2)设置响应编码格式;
3)设置响应实体;

package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * *resp对象之处理响应学习:
 *  设置响应行: 协议  状态码 状态消息
 *      resp.sendError(int status);
 *      作用:可以自主的响应状态给浏览器
 *  设置响应头
 *      addHeader(String name,String value) 添加响应头信息,同名数据不会覆盖
 *      setHeader(String nanme,String value) 设置响应头信息,会覆盖原有信息。如果没有此响应头则添加该信息。
 *  设置响应实体(处理结果)
 *      resp.getWriter().write("实体内容");
 *      注意:
 *          实体内容可以分开进行响应。
 *  注意:
 *      一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关的req对象和resp对象销毁。
 * @author zhang
 *
 */
public class ResponseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求数据
        // 处理请求数据
        // 响应处理结果
        // 设置响应行
        // 自定义响应404异常
//      resp.sendError(404);
        // 设置响应头
        // 添加响应头信息
        resp.addHeader("mouse", "thinkpad");
        resp.addHeader("mouse", "thinkpad2");
        // 设置响应头
        // resp.setHeader("mouse", "tow fly birds");
        // resp.setHeader("mouse", "tow fly birds3");
        // 设置响应实体
        resp.getWriter().write("resp object");
        resp.getWriter().write("resp object");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ResponseServlet</servlet-name>
    <servlet-class>com.zlw.servlet.ResponseServlet</servlet-class>
  </servlet>
<servlet-mapping>
    <servlet-name>ResponseServlet</servlet-name>
    <url-pattern>/response</url-pattern>
  </servlet-mapping>
</web-app>
响应结果

三、乱码问题

(1)使用String进行重新编码:
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
(2)Get方式请求:
1)在 service 方法中使用: req.setCharacterEncoding(“utf-8”);
2)在tomcat 服务器目录下的 conf 文件下找到 server.xml 文件,打开进行在Connector标签下添加useBodyEncodingForURL=“true”。
(3)Post方式请求:
1)在 service 方法中使用: req.setCharacterEncoding(“utf-8”);

package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * * 请求乱码问题:服务器获取的请求数据乱码
 *      post请求方式乱码:
 *          req.setCharacterEncoding("utf-8");
 *      get请求方式乱码解决:
 *          方式一:每个数据都要单独的进行转换
 *              String uname=req.getParameter("uname");
 *              String uname2=new String(uname.getBytes("iso-8859-1"), "utf-8");
 *          方式二:
 *              req.setCharacterEncoding("utf-8");  
 *              在tomcat的server.xml文件中的Connector标签中增加属性:  useBodyEncodingForURI="true"           
 * 响应乱码问题:浏览器中显示的服务器响应数据乱码
 *          resp.setContentType("text/html;charset=utf-8");
 * service代码编写流程:
 *      设置请求编码格式
 *      设置响应编码格式
 *      获取请求信息
 *      处理请求信息
 *      响应处理结果
 * @author zhang
 *
 */
public class CodeServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式
        req.setCharacterEncoding("utf-8");
        //设置响应编码格式
//      resp.setHeader("content-type", "text/html;charset=utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取请求数据
        String uname=req.getParameter("uname");
        //处理请求数据
        System.out.println(uname);
        //响应处理结果
        resp.getWriter().write("请求处理完毕!");
    }

}
结果

四、简单的登录练习

1.Request请求

package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Users extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式
        req.setCharacterEncoding("utf-8");
        //设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获取请求信息
        String uname = req.getParameter("uname");
        String pwd=req.getParameter("pwd");
        //处理请求信息
        if ("张三".equals(uname)&&"123".equals(pwd)) {
            resp.getWriter().write("登录成功!");//响应处理结果
        } else {
            resp.getWriter().write("用户名或密码错误");//响应处理结果

        }
    }
}

2.Response响应:

package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Login extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式
        req.setCharacterEncoding("utf-8");
        //设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获取请求信息
        //处理请求信息
        //响应处理结果
        resp.getWriter().write("<html>");
        resp.getWriter().write("<head>");
        resp.getWriter().write("</head>");
        resp.getWriter().write("<body>");
        resp.getWriter().write("<form action='users' method='post'>");
        resp.getWriter().write("用户名:<input type='text'name='uname' value=''/><br/>");
        resp.getWriter().write("密码:<input type='password'name='pwd' value=''/><br/>");
        resp.getWriter().write("<input type='submit' value='登录'/>");
        resp.getWriter().write("</form>");
        resp.getWriter().write("</body>");
        resp.getWriter().write("</html>");

    }
}

3.配置web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>Login</servlet-name>
    <servlet-class>com.zlw.servlet.Login</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>Users</servlet-name>
    <servlet-class>com.zlw.servlet.Users</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Users</servlet-name>
    <url-pattern>/users</url-pattern>
  </servlet-mapping>

</web-app>
正确的用户名和密码
响应结果
错误的用户名和密码
响应结果
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容