Response
响应头
手动发送404状态码
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.sendError(404,"找到也不告诉你");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>day08.com.cai.servlet.demo1.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
重定向
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//重定向返回状态码为302
resp.setStatus(302);
//发送响应头,重定向到新地址
resp.setHeader("location","http://www.baidu.com");
}
5秒后跳转
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1. 设置响应头为Refresh:5 url=AServlet
response.setHeader("Refresh", "5;url=AServlet");
//使用字符流发送提示
response.getWriter().println("您将在5秒后跳转到AServlet");
}
相应正文
字节流发送汉字
使用字节流发送汉字,需要服务器端编码和客户端解码一致,eclipse默认使用GBK编码(可在设置中更改编码类型),浏览器默认使用GBK编码,两边编码一致,不会产生乱码。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得输出字节流
OutputStream os=response.getOutputStream();
//输出中文
os.write("你好,世界".getBytes());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得输出字节流
OutputStream os=response.getOutputStream();
//设置浏览器编码
//response.setHeader("Content-Type", "text/html;charset=gbk");
os.write("<meta http-equiv='Content-Type' content='text/html;charset=gbk'>".getBytes());
//输出中文
os.write("你好,世界".getBytes("utf-8"));
}
字符流发送汉字
字符流默认使用iso-8859-1,在tomcat中设置。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得字符流
PrintWriter pw=response.getWriter();
//2.发送中文
pw.print("你好,世界!");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//控制字符流使用的编码,在获得字符流之前设置
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
//1.获得字符流
PrintWriter pw=response.getWriter();
//2.发送中文
pw.print("你好,世界!");
}
字节流发送图片
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0. 表示mime
response.setContentType("image/jpeg");
//1. 获得图片输入流
InputStream in=getServletContext().getResourceAsStream("/WEB-INF/one.jpg");
//2. 通过response获得输出字节流
OutputStream out=response.getOutputStream();
//3. 连个流对接
byte[] buffer=new byte[1024];
int len=0;
while((len=in.read(buffer))>0) {
out.write(buffer,0,len);
out.flush();
}
in.close();
}
字节流发送文件
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0. 表示mime
response.setContentType("application/java-archive");
//1. 获得图片输入流
InputStream in=getServletContext().getResourceAsStream("/WEB-INF/code.rar");
//2. 通过response获得输出字节流
OutputStream out=response.getOutputStream();
//3. 连个流对接
byte[] buffer=new byte[1024];
int len=0;
while((len=in.read(buffer))>0) {
out.write(buffer,0,len);
out.flush();
}
in.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0. 表示mime
String filename="code.rar";
response.setContentType(getServletContext().getMimeType(".rar"));
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//1. 获得图片输入流
InputStream in=getServletContext().getResourceAsStream("/WEB-INF/code.rar");
//2. 通过response获得输出字节流
OutputStream out=response.getOutputStream();
//3. 连个流对接
byte[] buffer=new byte[1024];
int len=0;
while((len=in.read(buffer))>0) {
out.write(buffer,0,len);
out.flush();
}
in.close();
}
Request
请求首行
请求头
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074
request.getServerName(): localhost
request.getServerPort(): 8080
请求正文
String getParameter 根据键获得值
Map getParameterMap() 获得服务器保存表单参数的容器. 就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
Enumeration getParameterNames() 获得提交的所有键
String[] getParameterValues(String name) 根据键获得值. 获得一键对应多个值的情况的.
GET方式获取参数
1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.
2.服务器负责解码.服务器默认使用ISO-8859-1解码. 如下配置的URIEncoding来决定解码码表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
如上配置会影响整个服务器不推荐.
我们使用如下代码解决:
//获得参数
String name = request.getParameter("name");
//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正确的码表重新解码
String newName = new String(nameByte,"UTF-8");
System.out.println("解决之后的:"+newName);
Post方式获取参数
因为Post解码是在第一次调用getParameter之前,那么解决乱码只需要在调用该方法之前设置编码:
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
请求转发
一个servlet处理完毕后交给下面的servlet(JSP)继续处
实际情况中,主要转发给JSP处理
在servlet中输出正文没有结果
//login.jsp
<form action="/MyTestProject/IServlet" method="get">
用户名:<input type="text" name="name" /><br/>
密码:<input type="text" name="password" />
<input type="submit"/>
</form>
//success.jsp
<body>
恭喜的登陆成功
</body>
//failuer.jsp
<body>
登陆失败<a href="/MyTestProject/login/login.jsp">返回</a>
</body>
//IServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1,获得表单提交的用户名和密码
String name=request.getParameter("name");
String password=request.getParameter("password");
//2. 判断提交是否正确
if(name!=null&&name.trim().length()>0&&name.equals("tom")&&
password!=null&&password.trim().length()>0&&password.equals("1234")) {
//成功==》 转发到成功页面
request.getRequestDispatcher("/login/success.jsp").forward(request, response);
}else {
//失败==》转发到失败页面
request.getRequestDispatcher("/login/failure.jsp").forward(request, response);
}
//语句不会输出
//response.getWriter().print("aaaa");
}
请求包含
//JServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("这是正文部分<hr/>");
request.getRequestDispatcher("/KServlet").include(request, response);
}
//KServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("这是页脚部分<hr/>");
}
response
响应首行(404,500)
setStatus(int)
sendError(int,String)
响应头
setHeader
addHeader
响应空行
响应正文
字符流 getWriter
字节流 getOutputstream
输出中文时,保证两端编码一致即可.
编码控制:
字符流:
1.response.setCharacterEncoding(“UTF-8”);
2.response.setContentType(“text/html;charset=utf-8”);
字节流:
string.getBytes(“UTF-8”);
浏览器解码控制:
1.response.setHeader(“Content-Type”,”text/html;charset=utf-8”);
2.response.getWriter().print(“”);
3.response.setContentType(“text/html;charset=utf-8”);
request
一:获得信息
getMethod
getContextPath
getRequestURI
getRequestURL
getServletPath
getParameter 获得参数
getParameterNames 获得所有key
getParameterValues 根据key获得值(数组)
getParameterMap 获得封装参数的map
二:转发,包含
转发: 将请求和响应继续向下传递到另一个servlet(jsp).
功能: servlet中处理逻辑, 把显示的功能交给另一个servlet(jsp)来做.
转发和重定向对比:
1.转发不会改变地址栏,重定向会.
2.转发是请求一次,重定向请求两次.
3.转发过程中只有一个request对象产生,重定向是两个.
4.转发不能转发到站外,重定向可以发送到站外.
5.重定向的第2个请求的请求方式是什么,get. 转发中第2个servlet(jsp)是什么请求方式?第一个servlet是什么第2个就是什么.
包含: 两个servlet(jsp)共同完成响应.
功能: 将页面重复内容封装.使用包含功能引用重复内容封装的页面.
三:域对象
request域.
一般使用在转发时. servlet处理完逻辑,将处理结果放到request域中,在jsp中取出显示.
关于域对象的操作:
setAttribute
getAttribute
removeAttribute
getAttributeNames