Request&Response

1 request和response

1.1获取请求参数

1.1.1通过request的getParameter方法获取请求参数。

此方法在ServletRequest接口中,而doGet/doPost方法中传入的参数是HttpServletRequest,是servletRequest的子接口。

 

Request对象有tomcat创建,传入了处理方法。

案例:

注意参数的名称

getParameter返回String类型的参数。

@Override

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

       System.out.println("自己的处理方法doGet");

       String username = request.getParameter("username");

       String loginName = request.getParameter("loginName");

       String password = request.getParameter("password");

       String email = request.getParameter("email");

       String tel = request.getParameter("tel");

      

       String genterStr = request.getParameter("gender");

       //得到的是String类型的参数,需要强制类型转换

       int gender = Integer.parseInt(genterStr);

       String mark = request.getParameter("mark");

      

        System.out.println("username="+username+",loginName:"+loginName+",password="+password+",email="+email

              +",tel="+tel+",gender="+gender+",mark="+mark);

      

    }

测试结果:

 

如果没有输入任何值的情况:

没有输入密码

得到空字符串:

如果是数字没有输入,会出现转换异常。

 

参数名称写错了:

测试结果:

如果参数名写错(没有指定的参数),会返回null。

 

request的getParameter无所谓是get请求还是post请求。都可以正常使用。

 

 

1.1.2获取多个同名的请求参数,比如复选框。

请求后的参数中有同名的参数:

在后台通过request的getParameterValues获取。返回的是一个字符串数组。

       //获取兴趣爱好

       String[] values = request.getParameterValues("enjoy");

       System.out.println("enjoys:");

       for (String value : values) {

           System.out.print(value+",");

       }

       System.out.println();

测试结果:

1.1.3 request中和请求参数相关的其他API

S1:HttpServletRequest中的getQueryString()方法。

此方法用来获取请求参数字符串

Tips:此方法在post请求中是无效的。

 

S2:ServletRequest中的getParameterMap()。

此方法返回的是一个参数map。其中key就是参数名,value是参数数组。

返回值中map的value是数组,无论请求参数是一个值,还是多个值都是存储在数组中。

案例:

//获取请求参数的map

       Map<String, String[]> parameterMap = request.getParameterMap();

       Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();

       for (Entry<String, String[]> entry : entrySet) {

           //参数名称

           String pname = entry.getKey();

           System.out.print(pname+":");

           //获取参数值

           String[] values = entry.getValue();

           for(String value : values) {

              System.out.print(value+",");

           }

           System.out.println();

       }

结果:

1.2响应客户端

1.2.1通过输出流直接响应客户端

请求都是通过浏览器创建的请求信息,发送到服务器端进行请求的。

响应客户端的信息是由服务器创建的,但是我们可以做各种修改。

客户端请求服务器端时,客户端和服务器端存储一个管道,中间有输入流和输出流。客户端的请求信息也是通过输入输入到服务器端的,服务器端其实也是通过输出流将信息输入出到客户端。

 

案例:

//通过response得到字符输出流

       PrintWriter writer = response.getWriter();

       //通过writer输出字符到客户端

       writer.write("<h1>login over!</h1>");

       writer.flush();

       writer.close();

响应结果:

响应头:

这个响应头消息是由服务器创建的。

响应中文:

乱码:

通过设置响应头调整编码。

通过response.setContentType();

观察响应头消息:

响应头中消息有些是有特殊的API的,也可以使用统一的API设置。

 

通过统一的API设置自定义的响应头消息:

客户端依然可以读取到自定义的响应头消息:

1.2.2通过输出流响应的方式实现一个用户列表的业务

实现DAO:

public List<Account> queryAll(){

       List<Account> accounts = new ArrayList<>();

       String sql = "select * from account";

       QueryRunner runner = new QueryRunner();

       Account account = null;

       try {

           accounts = runner.query (JDBCUtils.getCon(), sql,new BeanListHandler<Account>(Account.class));

       } catch (Exception e) {

           e.printStackTrace();

       }

       return accounts;

    }

实现service:

    /**

     * 返回所有的账户

     * @return

     */

    public List<Account> queryAll(){

       return accountDAO.queryAll();

    }

   

实现AccountListServlet

package com.igeek.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.util.List;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.igeek.pojo.Account;

import com.igeek.service.AccountService;

 

/**

 * Servlet implementation class AccountListServlet

 */

public class AccountListServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    private AccountService accountService = new AccountService();

 

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

       //查询所有的账户,响应账户列表

       List<Account> accounts = accountService.queryAll();

       //响应客户端

       response.setContentType("text/html;charSet=utf-8");

       PrintWriter writer = response.getWriter();

       //拼接输出内容

       StringBuffer sb = new StringBuffer();

       sb.append("<html><head><title>账户列表</title>");

       sb.append("<link rel=\"stylesheet\" type=\"text/css\"\r\n" +

              "   href=\"js/bootstrap-3.3.7-dist/css/bootstrap.min.css\">");

       sb.append("<link rel=\"stylesheet\" type=\"text/css\"\r\n" +

              "   href=\"js/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css\">");

       sb.append("<script type=\"text/javascript\" src=\"js/jquery-2.1.0.min.js\"></script>");

       sb.append("<script type=\"text/javascript\"\r\n" +

              "   src=\"js/bootstrap-3.3.7-dist/js/bootstrap.min.js\"></script>");

       sb.append("</head><body>");

       sb.append("<table  class='table'><tr><th>#</th><th>账户名</th><th>登录名</th><th>电话</th><th>邮箱</th><th>创建时间</th><th>操作</th></tr>");

       //遍历账户列表循环的生成其他的tr

       for (Account a : accounts) {

           sb.append("<tr><td>"+a.getAccountId()+"</td><td>"+a.getAccountName()+"</td><td>"+a.getLoginName()+"</td>"

                  + "<td>"+a.getAccountTel()+"</td><td>"+a.getAccountEmail()+"</td>"

                         + "<td>"+a.getCreateTime()+"</td>"

           + "<td><a href='inputEdit?accountId="+a.getAccountId()+"'>修改</a><a href='deleteAccount("+a.getAccountId()+")'>删除</a></td></tr>");

       }

       sb.append("</table></body></html>");

       //输出内容

       writer.write(sb.toString());

       writer.close();

    }

 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       //调用自己的doGet方法。   无论是get请求还是post请求,都是同样的处理方式。

       this.doGet(request, response);

    }

 

}

 

 

请求效果:

1.2.3通过重定向的方式响应客户端

Servlet处理完成之后,重新定位到其他的页面(url)响应客户端。

案例:

登录完成之后根据登录的结果响应对应的页面。

添加登录成功的页面和登录失败的页面。

loginSuc.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>登录成功!</title>

</head>

<body>

<h1>登录成功!</h1>

<a href="accountList">用户列表</a>

</body>

</html>

loginFal.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>登录失败</title>

<script>

    int num = 5;

    window.οnlοad=function(){

       rediect();

    }

    function rediect(){

       if(num==0){

           //跳转到登录页面

           location.href="login.html";

           return;

       }

       var p = document.getElementById("p");

       p.innerHTML= "等待"+num+"秒钟自动跳转到等了页面............."

       num--;

       setTimeout("reiect()",1000);

    }

</script>

</head>

<body>

<h1>登录失败</h1>

<a href="login.html">再登录</a> <br/>

<a href="regist.html">注册</a> <br/>

<p id="p"></p>

</body>

</html>

修改登录的servlet

 

思考问题:是否可以通过重定向的方式进入一个账户列表页面(accountList.html)再次页面显示账户列表信息。

 

是否可以通过重定向进入一个servlet?

自行测试

 

1.3请求中的乱码

在tomcat8以上的版本(包括8)。GET请求是不会乱码的。

因为tomcat8开始设置的默认字符集就是utf-8。而tomcat8以前的版本设置的默认字符集是iso8859-1。

 

1.3.1tomcat8以前版本中的乱码解决

无论是GET请求还是POST请求都会乱码

1 。 修改tomcat的默认字符集。

 

通过代码修改字符集:

如果是post请求,直接设置request的字符集就可以解决问题:

Get请求同设置request的编码是无法解决的。

因为get请求参数是携带在url后面的,中文首先会被浏览器进行编码。再到后台时即使设置request的编码依然不能解决问题。

 

解决办法(解码):使用iso8859-1将获取的请求参数转换为字节数组。再用utf-8将字节数组创建为字符串。

1.3.2tomcat8+的乱码问题

Tomcat8+的默认字符集就是utf-8,所以get请求不需要解码。

Post请求的处理方式和tomcat7处理方式一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值