参考:JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)_刘扬俊的博客-CSDN博客_servlet
我学习的代码主要还是以之前用的例子为例 ,之前写了个ServiceContext的实现案例
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext=this.getServletContext();
String username=(String) servletContext.getAttribute("username");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
首先了解一下Http的常见响应码
web服务器接收到http请求,分别会创建一个Request和Response。 然后看到我们经常使用的
HttpServletRequest(获取客户端传过来的参数)
HttpServletResponse(给客户端响应信息)
首先看HttpServletResponse
里面定义了很多状态码
Response一些实际应用:
1.向浏览器输出消息
例如
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer=resp.getWriter();
writer.print("nice");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
2.下载文件
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取文件的路径(我这里直接写死了)
String path="D:\\Javaproject\\SSM学习\\web\\src\\main\\resources\\d.jpg";
//2.下载的文件名 substring截取字符段,最后出现 \ 的下标 截取的话 是包含 \ 下标的 所有 下标要 +1
String fileName=path.substring(path.lastIndexOf("\\")+1);
//3.Content-Disposition 的作用:当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型
resp.setHeader( "Content-Disposition", "attachment;filename=" +fileName);
//4.获取下载文件的输入流
FileInputStream fis=new FileInputStream(path);
//5.创建缓冲区
int len=0;
byte[] buffer=new byte[1024];
//6.获取OutputStream对象
ServletOutputStream out=resp.getOutputStream();
//7.FileInputStream写入到buff缓冲区,再用获取OutputStream对象将缓冲区中的数据输出到客户端
while ((len=fis.read(buffer))!=-1){
out.write(buffer,0,len);
}
fis.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
3.随机数验证码(看看就好,代码过时了)
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器三秒刷新一次
resp.setHeader("refresh","3");
//内存中创建一个图片
BufferedImage image=new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR);
//得到图片
Graphics2D g=image.createGraphics();
//设置图片的背景色
g.setColor(Color.white);
g.fillRect(0,0,80,20);
//给图片写数据
g.setColor(Color.BLUE);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(randomnum(),0,20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpeg");
//不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
private String randomnum(){
Random random=new Random();
String num=random.nextInt(9999)+""; //随机数范围
StringBuffer sb=new StringBuffer();
for(int i=0;i<7-num.length();i++){
sb.append("0"); //随机数不足7位,拼接0
}
String s= sb.toString()+num;
return s;
}
}
4.实现重定向(重要)
resp.sendRedirect("/image");
理解原理 ,重定向要注意路径问题(发生404的时候)
总结:1.转发是一次请求,重定向是两次2.转发不会改变url,重定向会改变3.请求转发是在服务器内部完成的,而重定向是在客户端完成的4.转发的url必须是当前web工程内部的地址,重定向可以是任意地址
HttpServletRequest
HttpServletRequest,代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获取客户端的所有信息。
Request的一些应用
1.获取前端传递的参数
方法二,三不常用,一和四的区别是四的返回类型是数组
2.请求转发
public class RequestServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
//请求转发
req.getRequestDispatcher(req.getContextPath()+"/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>requestservlet</servlet-name>
<servlet-class>com.wjc.servlet.RequestServlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>requestservlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
登陆页面
<div style="text-align: center">
<form action="/login" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="text" name="password"> <br>
爱好:
<input type="checkbox" name="hobbys" value="女孩">女孩
<input type="checkbox" name="hobbys" value="电影">电影
<input type="checkbox" name="hobbys" value="喝茶">喝茶
<input type="checkbox" name="hobbys" value="按摩">按摩
<br>
<input type="submit">
</form>
</div>
</body>
</html>
在这里出现了个错误,如果tomcat里面的上下文配置了路径页面跳转会报错, 看到一个评论大佬的回答是
getRequestDispatcher分成两种,可以用request调用,也可以用getServletContext()调用 不同的是request.getRequestDispatcher(url)的url可以是相对路径也可以是绝对路径。而this.getServletContext().getRequestDispatcher(url)的url只能是绝对路径。
参考文章:
getRequestDispatcher 和sendRedirect区别_geekfly的博客-CSDN博客
ServletRequest.getRequestDispatcher和ServletContext.getRequestDispatcher的区别。_mark_to_win的博客-CSDN博客