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处理方式一样。