一、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>



