前端菜鸟玩Servlet

简介

Servlet(Server Applet) 。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,理解Servlet为后者。

所以说servlet就是实现了Servlet接口的类!用来响应HTTP请求并处理返回

生命周期

同样的在一个servlet的创建到销毁同样存在钩子函数

  1.  Servlet 通过调用 init () 方法进行初始化。
  2.  Servlet 调用 service() 方法来处理客户端的请求。
  3.  Servlet 通过调用 destroy() 方法终止(结束)。

init()

整个生命周期只执行一次,,init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。可以做一些例如建立数据连接的操作

service()

在service方法会调用doGet、doPost、doPut、doDelete等方法,所以我基本只要根据客户端的请求方式重写doGet、doPost方法,因为这get,post两种请求方式最多。

destroy()

整个生命周期只执行一次,可以做一些例如关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘以及其他类似的清理活动。

 

注解配置方式

在servlet3开始往后无需想之前版本使用web.xml中的配置去映射到某个servlet才能使用,可以直接使用注解WebServlet实现,写在方法前

复制
//@WebServlet("/login") @WebServlet(name = "login", value = "/login" loadOnStartup="1") public class login extends HttpServlet { /*get请求时返回登录页面*/ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); //执行相应数据格式为html ...... }

value是指访问地址,loadOnStartup是指servlet在加载时的顺序,理解成优先级

 

HelloServlet

复制
package com.hhtc.javaweb; import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { //最重要的是继承HTTPServlet抽象类,该类最终继承自Servlet接口 private String message; public void init() { message = "Hello World!"; } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>init()初始化的数据message为:" + message + "</h1>"); out.println("</body></html>"); } @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } public void destroy() { PrintWriter out = response.getWriter(); out.println("destroy()执行"); } }

ServletContext对象

该对象是全局存储信息的对象,所有的客户端都可以访问这个共有的对象,

WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用,并且它被所有客户端共享。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。

当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁。

共享数据

复制
//某个servlet设置共享数据 ServletContext context = this.getServletContext();//获取上下文 String username = "lsp"; context.setAttribute("username",username); //另一个servlet获取共享数据 final ServletContext context = this.getServletContext(); String username = (String)context.getAttribute("username");

请求转发

一般请求转发都是使用HTTPServletRequest实现,虽然该ServletContent上下文对象也可实现

this.getServletContext().getRequestDispatcher("/login").forward(request, response);

 

因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!

 

HttpServletResponse

HttpServletResponse和下面的HttpServletRequest都是在调用doGet,doPost方法时传入的两个对象参数

HttpServletResponse是第二个参数,用于设置HTTP响应

复制
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

请求重定向:resp.sendRedirect("/login/index2");

在服务器收到请求后,一般逻辑都是处理好数据之后对其响应返回数据,但不,可以直接请这个请求处理交由另一个servlet去处理,再去响应。

还有很多方法,例如void setCharacterEncoding(String charset),用于设置响应的编码类型,等等很多方法都是对HTTP响应的设置

 

 

HttpServletRequest

HttpServletRequest是doPost或doGet方法的第一个参数,用于设置HTTP请求

在servlet程序中可以通过Cookie[] getCookies()返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。

读取请求参数

复制
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <html> <head> <title>Title</title> </head> <body> <h1>用户登录</h1> <form action="${pageContext.request.contextPath}/login" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> <input type="submit" value="提交"> </form> </body> </html>

从上边前端页面输入的数据要在servlet中拿到数据

  • req.getRequestDispatcher("/index.jsp").forward(req,resp);  请求转发,也就是返回哪个jsp页面
  • req.getParameter("name")  获取前端传过来的参数,可以是get方式也可以是post方式传过来的,反正通过k获取
复制
public class Login extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8");//设置请求响应编码 resp.setCharacterEncoding("utf-8"); //获取请求参数 final String username = req.getParameter("username"); final String password = req.getParameter("password"); System.out.println("用户名:" + username); System.out.println("密码:" + password); //请求转发 req.getRequestDispatcher("/success.jsp").forward(req,resp); } }

 

参考:https://www.cnblogs.com/wyzstudy/p/15711382.html

posted @   写点bug不过分吧  阅读(103)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示