- servlet是sun公式开发的动态web的一门技术,servlet是JavaEE规范之一,规范就是接口。servlet是Javaweb三大组件之一(servlet程序,filter过滤器,listener监听器)。servlet就是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
- 想开发一个servlet程序需要完成两个小步骤:1 编写一个类,实现servlet接口。2 把开发好的java类部署到web服务器中。
- HttpServlet实例
- 新建一个maven项目文件,在pom.xml中加入依赖:java.servlet java.servlet.jsp
- 新建一个子模块,更新web.xml文件配置,将目录结构搭建完整
- 编写一个普通类,实现servlet接口,这里直接继承HttpServlet类
public class HelloServlet extends HttpServlet { // 由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入doGet"); PrintWriter writer = resp.getWriter(); writer.print("Hello,Servlet "); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
4.编写servlet映射
我们写的是java程序,但是要通过浏览器访问,浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。
helloServlet com.yang.servlet.HelloServlet helloServlet /hello
5.配置Tomcat
6.运行Tomcat服务器。
- web容器在启动的时候,它会为每个web程序都创建一个SernletContext对象,它代表了当前的web应用
- 共享数据
public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String username = (String) context.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("姓名:"+username); } }
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); String username = "李明"; servletContext.setAttribute("username",username); } }
3 HttpServletResponseHelloServlet com.yang.servlet.HelloServlet HelloServlet /hello GetServlet com.yang.servlet.GetServlet GetServlet /getServlet
- web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse。如果要获取客户端请求过来的参数,找HttpServletRequest,如果要给客户端响应一些信息,找HttpServletResponse。
- 简单分类
负责向浏览器发送数据的方法:
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法:
void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1); void setDateHeader(String var1, long var2); void addDateHeader(String var1, long var2); void setHeader(String var1, String var2); void addHeader(String var1, String var2); void setIntHeader(String var1, int var2); void addIntHeader(String var1, int var2);
响应的状态码:
200:请求响应成功
2xx:请求重定向:重新到新位置去
4xx:找不到资源 404 资源不存在
5xx:服务器代码错误 500 502:网关错误
int SC_ConTINUE = 100; int SC_SWITCHING_PROTOCOLS = 101; int SC_OK = 200; int SC_CREATED = 201; int SC_ACCEPTED = 202; int SC_NON_AUTHORITATIVE_INFORMATION = 203; int SC_NO_ConTENT = 204; int SC_RESET_ConTENT = 205; int SC_PARTIAL_ConTENT = 206; int SC_MULTIPLE_CHOICES = 300; int SC_MOVED_PERMANENTLY = 301; int SC_MOVED_TEMPORARILY = 302; int SC_FOUND = 302; int SC_SEE_OTHER = 303; int SC_NOT_MODIFIED = 304; int SC_USE_PROXY = 305; int SC_TEMPORARY_REDIRECT = 307; int SC_BAD_REQUEST = 400; int SC_UNAUTHORIZED = 401; int SC_PAYMENT_REQUIRED = 402; int SC_FORBIDDEN = 403; int SC_NOT_FOUND = 404; int SC_METHOD_NOT_ALLOWED = 405; int SC_NOT_ACCEPTABLE = 406; int SC_PROXY_AUTHENTICATION_REQUIRED = 407; int SC_REQUEST_TIMEOUT = 408; int SC_ConFLICT = 409; int SC_GONE = 410; int SC_LENGTH_REQUIRED = 411; int SC_PRECONDITION_FAILED = 412; int SC_REQUEST_ENTITY_TOO_LARGE = 413; int SC_REQUEST_URI_TOO_LONG = 414; int SC_UNSUPPORTED_MEDIA_TYPE = 415; int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; int SC_EXPECTATION_FAILED = 417; int SC_INTERNAL_SERVER_ERROR = 500; int SC_NOT_IMPLEMENTED = 501; int SC_BAD_GATEWAY = 502; int SC_SERVICE_UNAVAILABLE = 503; int SC_GATEWAY_TIMEOUT = 504; int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
- 常见应用
1.下载文件
1.要获取下载文件的路径 2.下载的文件名是什么 3.设置想办法让浏览器能够支持下载我们需要的东西 4.获取下载文件的输入流 5.创建缓冲区 6.获取OutputStream对象 7.将FileOutputStream流写入buffer缓冲区 8.使用OutputStream将缓冲区中的数据输出到客户端
public class FileResponse extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.要获取下载文件的路径 String realPath = "I:\Javaweb\servlet-04-response\target\classes\同花顺.png"; System.out.println("获取文件的路径"+realPath); // 2.下载的文件名是什么 String fileName = realPath.substring(realPath.lastIndexOf("\") + 1); // 3.设置想办法让浏览器能够支持下载我们需要的东西,中文文件名URLEncoder.encode编码 resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); // 4.获取下载文件的输入流 FileInputStream inputStream = new FileInputStream(realPath); // 5.创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; // 6.获取OutputStream对象 ServletOutputStream outputStream = resp.getOutputStream(); // 7.将FileOutputStream流写入buffer缓冲区 // 8.使用OutputStream将缓冲区中的数据输出到客户端 while ( (len = inputStream.read(buffer)) > 0){ outputStream.write(buffer,0,len); } inputStream.close(); outputStream.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
2.验证码功能
public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 如何让浏览器3秒自动刷新一次 resp.setHeader("refresh","3"); // 在内存中创建一个图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); // 得到图片 Graphics2D graphics = (Graphics2D) image.getGraphics(); // 设置图片的颜色背景 graphics.setColor(Color.white); graphics.fillRect(0,0,80,20); // 给图片写数据 graphics.setColor(Color.BLUE); graphics.setFont(new Font(null,Font.BOLD,20)); graphics.drawString(makeNum(),0,20); // 告诉浏览器,这个请求用图片的方式打开 resp.setContentType("image/jpg"); // 不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); // 把图片写给浏览器 ImageIO.write(image,"jpg",resp.getOutputStream()); } // 生成随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt(9999999) + ""; StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < 7 - num.length(); i++) { stringBuffer.append("0"); } num = stringBuffer.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
3.实现重定向
一个web资源收到客户端请求后,它会通知客户端去访问另一个web资源,这个过程叫做重定向。
常见场景:用户登录
public class RequestText extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入请求了"); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username+"+"+password); resp.sendRedirect("./success.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
Hello World! <%----%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>4 HttpServletRequestTitle success
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有的信息。
public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String[] hobbies = req.getParameterValues("hobbies"); System.out.println(username+"+"+password); System.out.println(Arrays.toString(hobbies)); // 通过请求转发 resp.setCharacterEncoding("utf-8"); req.getRequestDispatcher("./success.jsp").forward(req,resp); } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %>登录 登录欢迎分享,转载请注明来源:内存溢出
评论列表(0条)