文章目录
Response
响应HTML、JSON
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author lwj
* @date 2020/8/18 9:05
*/
@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Tomcat默认采用的编码是ISO-8859-1,与浏览器客户端解码不一致,所以在获取流之前设置Tomcat服务器字符打印输出流的编码
/*response.setCharacterEncoding("utf-8");
response.setHeader("content-type", "text/html;charset=utf-8");*/
response.setContentType("text/html;charset=utf-8");
//可以用一行代码实现
//普通的文本、HTML、JSON
PrintWriter writer = response.getWriter();
writer.write("<h2>中文乱码</h2>");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 9:33
*/
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json;charset=utf-8");
String s = "{\"username\":\"张三\",\"password\":\"123456\"}";
response.getWriter().write(s);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
响应字节数据
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 9:54
*/
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应字节数据
//图片在/WEB-INF/目录下
String realPath = getServletContext().getRealPath("/WEB-INF/bb812.jpg");
FileInputStream fis = new FileInputStream(new File(realPath));
ServletOutputStream sos = response.getOutputStream();
//获取字节输出流
byte[] bytes = new byte[1024];
int len = 0;
while ((fis.read(bytes)) != -1) {
sos.write(bytes);
}
sos.close();
fis.close();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
重定向
1、重定向到其它站点
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/15 16:01
*/
@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Request对象和Response对象都是由服务器创建、管理和销毁
System.out.println(request);
//org.apache.catalina.connector.RequestFacade@3e98bbfb
System.out.println(response);
//org.apache.catalina.connector.ResponseFacade@3aa738f0
//重定向
//response.setStatus(302);
//response.setHeader("location", "https://www.baidu.com");
//以上两步可以简写为
response.sendRedirect("https://www.baidu.com");
//1、重定向到外部站点
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
2、重定向到本Web应用内其它资源
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/15 17:07
*/
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("/index.jsp");
//response.sendRedirect("/myServlet");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
3、特点:
两次请求、两次响应
地址栏会发生变化
可以跳转内部资源,也可以跳转外部资源。
在重定向时,/后面需要添加Web项目的上下文路径,在该项目中上下文路径为空,所以可以直接/index.jsp、/myServlet。
Request
获取请求行
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
/**
* @author lwj
* @date 2020/8/18 11:18
*/
@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求行
String method = request.getMethod();
System.out.println("请求方式:" + method);
//请求方式:GET
String contextPath = request.getContextPath();
System.out.println("项目上下文路径:" + contextPath);
//项目上下文路径:
String requestURI = request.getRequestURI();
System.out.println("统一资源标识符:" + requestURI);
//统一资源标识符:/myServlet
StringBuffer requestURL = request.getRequestURL();
System.out.println("统一资源定位符:" + requestURL);
//统一资源定位符:http://localhost:8080/myServlet
String remoteAddr = request.getRemoteAddr();
System.out.println("请求的IP地址:" + remoteAddr);
//请求的IP地址:0:0:0:0:0:0:0:1
String queryString = request.getQueryString();
System.out.println("请求参数:" + queryString);
//请求参数:username=%E5%BC%A0%E4%B8%89&password=123456&vercifyCode=Xc3e
//GET请求参数在请求行,POST请求参数在请求体
//浏览器会对中文URL进行编码
String decode = URLDecoder.decode("%E5%BC%A0%E4%B8%89", "utf-8");
System.out.println(decode);
//张三
String protocol = request.getProtocol();
System.out.println("协议版本:" + protocol);
//协议版本:HTTP/1.1
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
URI与URL
URI标记了一个网络资源,仅此而已; URL标记了一个WWW互联网资源(用地址标记),并给出了他的访问地址。(URI是Uniform Resource Identifier,表示是一个资源; URL是Uniform Resource Locator,表示是一个地址。
URL是URI的子集,所有的URL都是URI,但不是每个URI都是URL,还有可能是URN
获取请求体
POST请求的请求体
获取字符数据:getReader()
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 13:38
*/
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BufferedReader reader = request.getReader();
//返回一个高效的字符流 我们通过一次读取一行的方法来获取请求参数数据,然后拆分字符串获取我们想要的数据
String s = reader.readLine();
//System.out.println(s);
//username=zhangsan&password=123456
String[] split = s.split("&");
String[] split1 = split[0].split("=");
System.out.println(split1[0] + "=" + split1[1]);
//username=zhangsan
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
获取字节数据:getInputStream(上传文件)
通用获取请求参数
1、GET
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 14:02
*/
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//张三
//123456
}
}
2、POST
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 14:02
*/
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//??????
//123456
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//张三
//123456
}
}
通用处理方式:处理get post 请求提交中文数据乱码问题
tomcat 8.0 以上 GET请求 中文参数 不乱码 tomcat已经处理了 我们不用处理
post 请求特有的方式 处理中文乱码
request.setCharacterEncoding("utf-8");
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 14:02
*/
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//张三
//123456
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//张三
//123456
}
}
通用获取表单数据
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
/**
* @author lwj
* @date 2020/8/18 14:46
*/
@WebServlet(name = "MyServlet4", value = "/myServlet4")
public class MyServlet4 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> strings = parameterMap.keySet();
for (String str : strings) {
String[] strings1 = parameterMap.get(str);
System.out.println(str + ":" + Arrays.toString(strings1));
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
请求转发
package org.westos.demo2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 15:11
*/
@WebServlet(name = "ServletDemo", value = "/servletDemo")
public class ServletDemo extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求到达ServletDemo...");
request.getRequestDispatcher("/servletDemo2").forward(request, response);
System.out.println("请求回到ServletDemo.");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package org.westos.demo2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 15:11
*/
@WebServlet(name = "ServletDemo2", value = "/servletDemo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求到达ServletDemo2...");
request.getRequestDispatcher("/servletDemo3").forward(request, response);
System.out.println("请求回到ServletDemo2.");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package org.westos.demo2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 15:11
*/
@WebServlet(name = "ServletDemo3", value = "/servletDemo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求到达ServletDemo3");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
特点:
1、一次请求、一次响应;
2、地址栏不发生变化;
3、只能转发到内部资源
请求转发与重定向的区别 ※
1、重定向是在浏览器的url上进行,所以不能重定向到WEB-INF目录下的文件;请求转发可以访问WEB-INF目录下的资源;
2、路径区别
重定向response.sendRedirect(“xxx”)是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器。/指的Tomcat的根目录,写绝对路径应该写成"/当前Web程序根名称/资源名" 。如"/WebModule/login.jsp","/bbs/servlet/LoginServlet"
转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序。绝对路径写法就是"/login.jsp"或"/servlet/LoginServlet"。
总结:在请求转发时,/代表当前Web应用,在重定向时,/后面需要添加Web项目的上下文路径。
路径的书写:
建议以/开头
请求转发:不需要加项目上下文路径
request.getRequestDispatcher("/myservlet2").forward(request, response);
页面上的路径和重定向:需要加上项目的上下文路径,
<img src="/MyServlet/mydemo4" id="img1"></img>
response.sendRedirect("")
<form action="" method="">
Request域对象
package org.westos.demo4;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 16:08
*/
@WebServlet(name = "MyDemo", value = "/demo")
public class MyDemo extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("username", "张三");
request.getRequestDispatcher("/demo2").forward(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package org.westos.demo4;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 16:09
*/
@WebServlet(name = "MyDemo2", value = "/demo2")
public class MyDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = (String) request.getAttribute("username");
System.out.println(username);
//张三
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
默认的欢迎页
当我们在IDEA启动Tomcat服务器,发布Web项目后,浏览器会自动打开某些页面。
在tomcat的conf目录的web.xml中默认配置了
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
所以,当我们有想要改动欢迎页面为home.html这样的需求时,可以修改Web项目的web.xml。
项目上下文路径
package org.westos.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author lwj
* @date 2020/8/18 16:15
*/
@WebServlet(name = "ServletDemo", value = "/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getContextPath());
// /20200818_Servlet_war_exploded
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
当重定向时,参数需要项目上下文路径,大多数时候需要用request.getContextPath()动态获取,前面不要加/。