HttpServletResponse和HttpServletRequest

1.HttpServletResponse

如果说DOM是javascript与HTML的桥梁,那么servlet就是前端与后端的桥梁,HttpServletRequest和HttpServletResponse就是之间的信使。

1.1请求行:

response. sendRedirect(String location) 请求重定向
等同于:
响应行---response. setStatus(int sc) 设置响应状态码,如302,告诉客户端要重新定向资源
响应头---response. setHeader(String name, String value) 设置响应头信息,告诉浏览器要去访问的URL

2.HttpServletRequest

2.1请求行

★ Get请求: http://localhost:8080/day09/servlet/req1?username=zs http/1.1
★ getMethod(); 获得请求方式
★ getRequestURL();返回客户端发出请求时的完整URL。 http://localhost:8080/day09/servlet/req1
★ getRequestURI(); 返回请求行中的资源名部分。/项目名后的路径:/servlet/req1
★ getContextPath(); 当前应用的虚拟目录。/项目名:/day09
★ getQueryString() ; 返回请求行中的参数部分。username=zs

2.2请求消息头

★ String getHeader(String name) 根据头名称得到头信息值
★ Enumeration getHeaderNames() 得到所有头信息name
★ Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值

2.3Servlet获取表单数据的方法

★ 单个请求参数的读取 调用HttpServletRequest的getParameter方法 ,返回与指定参数相应的值。参数区分大小写。参数没有相应的值则返回空String, 如果没有该参数则返回null。 对于多个同一参数名则返回首次出现的值。

获取表单数据

getParameter(String name) 通过名称获取表单数据
getParameterValues(String name) 提取复选框的方法
getParameterNames() 获取表单所有名称
getParameterMap() 获取表单提交的所有值
getInputStream() 获取表单字节流
注意:
getParameterValues方法,返回指定参数所有相应的值,返回类型为字符串数组。
getParameterNames和getParameterMap方法对参数名进行查找。返回的参数名不会按表单中的次序排列。
注册表单:
register.html:


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/webService/ServletDemo9" method="post">
        用户名:<input type="text" name="username" /><br /> 密码:<input
            type="password" name="password" /><br />
        <!--不能输入文字的,为了使后台接收文字,需要用到value属性 ;注释快捷键Ctrl+shift+c-->
        性别:<input type="radio" name="sex" value="男" checked="checked" />男 <input
            type="radio" name="sex" value="女" />女<br /> 
            爱好:
            <input type="checkbox"name="hobby" value="篮球" />篮球 
            <input type="checkbox"name="hobby" value="唱歌"/>唱歌 
            <input type="checkbox"name="hobby" value="跳舞"/>跳舞 
            <input type="checkbox"name="hobby" value="看书"/>看书
            <input type="checkbox"name="hobby" value="登山"/>登山   
            </br>
        
            所在城市: 
            <select name="city">
            <option >请选择</option>
            <option value="bj"  >北京</option>
            <option value="bj">北京1</option>
            <option value="bj">北京2</option>
            <option value="bj">北京3</option>
        </select>
        </br>
        <input type="submit" value= "注册">
        

    </form>
</body>
</html>

方法一:直接通过找名字来获取值

ServletDemo9.java:

package com.cms.Demo1.Service;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletDemo9
 */
public class ServletDemo9 extends HttpServlet {

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //接受到表单的数据, 先使用request设置服务器应该使用的字符编码,否则字符不统一会出现乱码
        request.setCharacterEncoding("UTF-8");
        //根据表单中的name属性名,获取value属性值的方法
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String sex = request.getParameter("sex");
        String city = request.getParameter("city");
        //数据有多个,用数组方式获得
        String[] hobbys = request.getParameterValues("hobby");
        System.out.println( username );
        System.out.println( password);
        System.out.println(sex);
        System.out.println(city);
        //hobbys不选的话默认值为空,不能输出任何结果
        for (int i = 0;hobbys!=null && i < hobbys.length; i++) {
            System.out.println(hobbys[i]);
            
        }

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

方法二:

上一种是通过请求对象一个一个的获取其值,而这种法子是先将名字全部获取到,在通过循环获取取出表单类型的值。

package com.cms.Demo1.Service;

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;

public class ServletDemo10 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //获取表单所有name的名字
        Enumeration<String> names = request.getParameterNames();
        //枚举
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();//得到每一个name名
            System.out.println(name);
            String[] values = request.getParameterValues(name);//得到name的value值
            //循环输出
            for (int i = 0; values!=null&&i < values.length; i++) {
                System.out.println(values[i]);
                
            }       
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

方法三:

方法一、二在控制台打印输出只是为了检验结果,最终的目的都是为了将获取到的表单数据插入到对应的数据库当中。这里我们就把将数据封装到类中。
创建用户类(字段要和表单名一致)
第一步:导入所需jar包


image.png

第二步:创建用户实体类(字段要和表单名一致)---
UserInformation.java 类文件

package com.cms.Demo1.entity;

import java.util.Arrays;

import org.apache.catalina.connector.Request;

public class UserInformation {
    //变量名与register.html表单的name一致.约定优于编码
    private String username;
    private String password;
    private String sex;
    private String[] hobby;
    private String city;
    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;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    //整合数据,重写toString方法
    @Override
    public String toString() {
        return "UserInformation [username=" + username + ", password=" + password + ", sex=" + sex + ", hobby="
                + Arrays.toString(hobby) + ", city=" + city + "]";
    }
}

第三步:编写Servlet文件

package com.cms.Demo1.Service;

import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

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

import org.apache.commons.beanutils.BeanUtils;

import com.cms.Demo1.entity.UserInformation;

public class ServletDemo9 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//  test(request);
        try {
            request.setCharacterEncoding("UTF-8");
            UserInformation u=new UserInformation();    
            System.out.println("封装数据前:"+u);
            BeanUtils.populate(u, request.getParameterMap());
            System.out.println("封装数据后:"+u);
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

结果:


image.png

与请求编码相关的方法:

//解决post方式编码,让请求和响应,页面和Servlet的输出的字符编码与预期一致。
*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式

//解决get方式编码, 将数据提交给String构造器,用指定字符集转换数据
String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);

注意:

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,463评论 1 20
  • 电话那头,妻告诉我女儿参加了学校的长跑比赛,在二十一名选手中名列第九的事情,心里突然有种莫名的悸动。女儿和我小时候...
    疯读阅读 507评论 0 0
  • 当看到这张图,请先扪心自问一下!图中哪一个是你?目前你是哪一个?将来你会是哪一个? 1对着干这类人,基本都是这种思...
    航海东路阅读 231评论 0 0
  • 早上起床,瞄了一眼日历,今天是腊月十五,天啊,还有半个月就过大年了,可是一点气氛都没感觉到,可能是城市的忙碌让人们...
    何以今昔昨阅读 368评论 0 1