
getParameter(name):获取指定单个参数
getParameterValues(name):同时指定多个参数
getParameterMap():获取所有参数
setCharacterEncoding(“UTF-8”):解决请求乱码问题
@WebServlet("/request_01")
public class HttpRequest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//获取一个请求参数
String username = request.getParameter("username");
System.out.println(username);
//获取多个请求参数
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//获取所有请求参数
Map parameterMap = request.getParameterMap();
for (Map.Entry entry : parameterMap.entrySet()) {
System.out.println(entry.getKey());
System.out.println(Arrays.toString(entry.getValue()));
}
}
}
3.2 使用BeanUtils封装
将获取的参数封装成一个类的成员属性
参数类
public class User implements Serializable {
private String username;
private String password;
private String[] hobby;
private String age;
getter();
setter();
@Override
public String toString() {
return "User{" +
"username='" + username + ''' +
", password='" + password + ''' +
", hobby=" + Arrays.toString(hobby) +
", age='" + age + ''' +
'}';
}
}
Servlet
@WebServlet("/beanutils")
public class UtilsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map parameterMap = request.getParameterMap();
User user = new User();
try {
//调用接口进行封装
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
}
}
4. 请求转发
4.1 跳转
在当前页面显示要跳转页面的内容,但只访问了当前Servlet一次
getRequestDispatcher("/路径").forward(request, response);
4.2 作为域对象
设置和获取属性,但只能访问一次。因此若再一个Servlet1中使用了设置,再访问另一个Servlet1中是无法获得值的,因为相当于Servlet1和Servlet各访问了一次共访问了两次
因此当request作为域对象时,需要与跳转相结合
void setAttribute(String name, Object o); Object getAttribute(String name);
设置值
@WebServlet("/dispatcher")
public class DispatcherServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name", "jay");
request.getRequestDispatcher("/getattr").forward(request, response);
}
}
获取值
@WebServlet("/getattr")
public class GetAttrServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String) request.getAttribute("name");
System.out.println(name);
}
}
二、Response
1. 响应行
响应行代表客户端访问的结果状态,常见的响应状态码
相关API:public void setStatus(int sc);:设置响应状态码
response.setStatus(403);2. 响应头 2.1 常见响应头
响应头是服务器指示浏览器去做什么
public void setHeader(String name, String value);:设置响应头
一个Key对应一个Value
一个Key对应多个Value
常用的响应头
**response.setHeader(“refresh”,“秒数;url=跳转的路径”); **:几秒之后跳转到指定的路径上
response.setHeader("Refresh","3;url=https://www.baidu.com"); //3s后跳转到百度
2.2 重定向
response.setHeader(“Location”, 重定向地址)
//1.设置状态码
response.setStatus(302);
//2.设置重定向的路径(绝对路径,带域名/ip地址的,如果是同一个项目里面的,域名/ip地址可以省略)
response.setHeader("Location","http://localhost:8080/day28/demo08");
response.setHeader("Location","/day28/demo08");
response.setHeader("Location","http://www.baidu.com");
response.sendRedirect(“重定向地址”);:封装了设置状态码和重定向两个功能
response.sendRedirect("http://localhost:8080/day28/demo08");
2.3 重定向与请求转发
相应操作体的API,页面输出只能使用其中的一个流实现,两个流是互斥的.
3.1 字符输出流public PrintWriter getWriter() throws IOException;
@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
...
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置服务器的响应字符集,避免乱码
response.setContentType("text/html;charset=UTF-8");
//要向浏览器输出响应体的信息,需要通过流来进行操作
//第一种:字符串,输出文本内容
PrintWriter writer = response.getWriter();
//使用字符流往浏览器输出文本
//1. writer()方法,只能输出字符串,如果输出int、float等等类型的话,则会有问题
writer.write("你好世界");
//2. print()方法,可以输出数字、字符串
writer.print(8);
}
}
3.2 字节输出流
字节输出流可以向浏览器输出任意类型资源
public ServletOutputStream getOutputStream() throws IOException;
@WebServlet("/demo05")
public class ServletDemo05 extends HttpServlet {
...
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 读取b.jpg图片,将其转换成字节输入流,使用ServletContext
ServletContext servletContext = getServletContext();
InputStream is = servletContext.getResourceAsStream("b.jpg");
//2. 使用字节输出流,将is中的字节都输出到浏览器
ServletOutputStream os = response.getOutputStream();
//注意:需要引入commons-io的jar包
IOUtils.copy(is,os);
os.close();
is.close();
}
}
三、路径问题
1. URL
URL组成部分
使用完整URL场景
绝对路径:
相对路径:
不以"/"开头的路径写法,它是以目标路径相对当前文件的路径,如
四、文件下载实例通过超链接方式下载(不推荐)
即将要下载的文件路径写到href属性中,如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了
通过响应头指定浏览器下载
Content-Disposition: 告诉浏览器下载
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
...
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取要下载的文件名
String filename = request.getParamter("filename");
//2.获取下载文件的流信息
InputStream is = request.getServletContext().getResourceAsStream("file/"+filename);
//2.设置mimetype文件头
String mimetype = request.getServletContext().getMimeType(file);
response.setHeader("Content-Type",mimeType);
//4.设置下载的响应头
//对文件名进行utf8编码避免乱码
String ecodeFIlename = URLEcoder.encode(filename, "UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+encodeFileName);
//5.输出流数据
ServletOutputStream os = response.getOutputStream();
IOUtils.copu(is, os);
//6.关闭资源
is.close();
os.close();
}
}