前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet必须掌握的知识(最全 精美版)

Servlet必须掌握的知识(最全 精美版)

作者头像
CaesarChang张旭
发布2021-01-26 15:54:31
8760
发布2021-01-26 15:54:31
举报
文章被收录于专栏:悟道悟道

1. 什么是Servlet

(1) Servlet ( Server Applet ),全称 Java Servlet 。是用 Java 编写的服务器端程序,其主要功能在于交互式地浏览和 修改数据,生成动态 Web 内容。 广义的 Servlet 是指任何实现了这个 Servlet接口的类. (2) Servlet 运行于支持 Java 的应用服务器中。从实现上讲, Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。 (3) Servlet 工作模式: ① 客户端发送请求至服务器 ② 服务器启动并调用 Servlet , Servlet 根据客户端请求生成响应内容并将其传给服务器 ③ 服务器将响应返回客户端

2. Servlet API

3. 第一个Servlet

(1) 创建一个类实现Servlet接口,重写方法。或继承HttpServlet亦可 public class LoginServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { // 初始化方法 } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // 处理 get/post 请求的方法 } @Override public String getServletInfo() { return null; } @Override public void destroy() { // 销毁的方法 } } (2) 在web.xml文档中配置映射关系XML中配置好这个Servlet的映射关系: <servlet> <servlet-name>自定义名称</servlet-name> <servlet-class>处理请求的类的完整路径</servlet-class> </servlet> <servlet-mapping><!-- mapping 表示映射 --> <servlet-name>自定义名称</servlet-name> <url-pattern>请求名</url-pattern> </servlet-mapping>

(3) 启动tomcat,在浏览器输入http://localhost:8080/工程名/访问服务器的路径

4. Servlet工作原理

(1) Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生 Servlet 实例和调用它具体的方法。但是要注意的是, 在一个应用程序中,每种 Servlet 类型只能有一个实例 。 (2) 用户请求致使 Servlet 容器调用 Servlet 的 Service ()方法, 并传入一个 ServletRequest 对象和一个 ServletResponse 对象ServletRequest 对象和 ServletResponse 对象都是由 Servlet 容器(例如 TomCat )封 装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。 (3)ServletRequest 中封装了当前的 Http 请求,因此,开发人员不必解析和操作原始的 Http 数据。 ServletResponse 表示当前用户的 Http 响应,程序员只需直接操作 ServletResponse 对象就能把响应轻松的发回给用户。 (4) 对于每一个应用程序, Servlet 容器还会创建一个 ServletContext 对象。这个对象中封装了上下文(应用程序) 的环境详情。每个应用程序只有一个 ServletContext 。每个 Servlet 对象也都有一个封装 Servlet 配置的 ServletConfifig 对象。

5. Servlet的生命周期

当客户端首次发送第一次请求后,由容器(web服务器(tomcat))去解析请求, 根据请求找到对应的servlet,判断该类 的对象是否存在,不存在则创建servlet实例,调取init()方法 进行初始化操作,初始化完成后调取service()方法,由 service()判断客户端的请求方式,如果是get,则执行doGet(),如果是post则执行doPost().处理方法完成后,作出相 应结果给客户端.单次请求处理完毕。 当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init(),而直接执行service方法,调取 doGet()/doPost()方法。 当服务器关闭时调取destroy()方法进行销毁。 四个过程: (1)实例化 --先创建servlet实例 (2)初始化 --init() (3)处理请求 ---service() (4)服务终止 --destory()

6. 请求

HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口) 常用方法: 1)String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String 注:服务器在接收数据时使用字符串统一接收 2)String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据 3)void setCharacterEncoding(String charset) 指定每个请求的编码(针对post请求才起作用) 4)RequestDispatcher getRequestDispatcher(String path) --跳转页面 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 示例: request.getRequestDispatcher("../success.jsp").forward(request,response); 5)存值 request.setAttribute("key",value); 6)取值 request.getAttribute("key");//取值后需要向下转型 示例 : String a1=(String)request.getAttribute("uname"); 补充1:客户端如何发送数据给服务器方式 1:通过表单 get/post提交 方式2:通过a标签发送数据(get提交) <a href=" 请求名 ?key=value&key=value&key=value..."> 示例 : <a href="/login?a=10&name=abc&pass=123"> 这里的 key 值 = 表单元素的控件名, value 值 = 表单中控件的 value 属性值 注 : 第一个参数使用 ? 拼接 , 之后的参数使用 & 拼接,获取数据还是通过 String name=request.getParameter("name"); 方式3:通过地址栏直接拼接-get请求 方式4:js提交数据-get请求 kk=" 目标请求 ?key=value&key=value" 注 : 方式 2/3 都属于 get 提交方式 , 表单提交可以使用 get 、 post 提交方式 补充2:处理请求乱码的问题 方式 1 : setCharacterEncoding("UTF-8"); / /post提交 时管用 方式2: String s=new String(变量名.getBytes("ISO-8859-1"),"UTF-8");//针对于 get提交时 中文乱码 示例 : String s=new String(request.getParameter("key").getBytes("ISO-8859-1"),"GBK"); 补充3:get和post的区别 1 、 GET 请求,请求的数据会附加在 URL 之后,以 ? 分割 URL 和传输数据,多个参数用 & 连接。 URL 的编码格式采用的 是 ASCII 编码,而不是 uniclde ,即是说所有的非 ASCII 字符都要编码之后再传输。 POST 请求: POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上面的 item=bandsaw 就是实际的传输数 据。 因此, GET 请求的数据会暴露在地址栏中,而 POST 请求则不会。 2、传输数据的大小 在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限制。但是在实际开发过程中,对于 GET ,特定的浏览器 和服务器对 URL 的长度有限制。因此,在使用 GET 请求时,传输数据会受到 URL 长度的限制。 对于 POST ,由于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST 提交数据大小进行 限制, Apache 、 IIS 都有各自的配置。 3、安全性 POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面 GET 提到的安全方法中的安全,上面提到的 安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过 GET 请求,用户名和密码都会暴露再 URL 上,因为 登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到 了。除此之外, GET 请求提交的数据还可能会造成 Cross-site request frogery 攻击

7. 响应

在Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响 应消息。 在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。 常用方法 : void addCookie(Cookie var1);//给这个响应添加一个cookie void sendRedirect(String var1) ;//发送一条响应码,将浏览器跳转到指定的位置 PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中, 随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。 setContentType() 设置响应内容的类型 重定向和转发的对比 重定向 :response.sendRedirect() 转发 :request.getRequestDispatcher("../success.jsp").forward(request,response); 相同点 : 都用来跳转页面 不同点 : a.重定向时地址栏会改变,request中存储的数据会丢失.转发时地址栏显示的是请求页面的地址,request数据可以保 存。 b.转发属于一次请求一次响应,重定向属于两次请求(地址栏修改了两次)两次响应。 补充 : 使用 out 对象往页面中输出 js 或 html,css out.print("<script type='text/javascript'>alert(' 登录失败 ');location='../login.jsp'</script>"); 注 : 使用 js 跳转页面,也会丢失 request 中的数据

8. 会话

request存的值只能在单次请求中保存,保存的数据不能跨页面,当重定向时,request存的值会丢失 session 的数据可以在多个页面中共享 , 即使重定向页面 , 数据不会丢失 session 中可以包含 n 个 request 。 会话的概念 : 从打开浏览器到关闭浏览器 , 期间访问服务器就称为一次会话 常用方法 : void setAttribute(String key,Object value) 以key/value的形式保存对象值,将数据存储在服务器端 Object getAttribute(String key) 通过key获取对象值 void invalidate() 设置session对象失效 String getId() 获取sessionid,当第一次登录成功后,session会产生一个唯一的id,浏览器之后访问时如果发现id值 还是之前id,那么说明 当前访问的属于同一个会话 void setMaxInactiveInterval(int interval) 设定session的非活动时间 示例 : 方式 1: session.setMaxInactiveInterval(10*60);// 设置有效时间为 10 分钟 方式 2: 修改 web.xml <session-config> <session-timeout>10</session-timeout>// 单位 : 分钟 </session-config> int getMaxInactiveInterval() 获取session的有效非活动时间(以秒为单位),默认的有效时间:30分钟 void removeAttribute(String key) 从session中删除指定名称(key)所对应的对象 小结 :让session失效的方式 ( 1 ) invalidate() ( 2 ) removeAttribute("key") ( 3 )直接关闭浏览器。 示例 : 使用 session 验证用户是否登录 补充 : 自动刷新到某页面:

注 : 在 head 标签中添加该标签,单位 : 秒

9.获得初始化参数(比如设置编码) request.setCharacterEncoding("utf-8");代码的耦合度太高,不便于后期维护修改。可以通过初始化参数实现 实现方式 : (1)web.xml中先定义初始化参数 <servlet> <servlet-name></servlet-name> <servlet-class></servlet-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </servlet> (2)servlet中获得初始化参数,重写init()方法 public void init(ServletConfig config) throws ServletException { encoding= config.getInitParameter("encoding"); } 注意:这种方式的初始化参数仅限于当前servlet中使用。



2.全局初始化参数 (1)定义,context-param是和servlet标签同级别 <context-param> <param-name>bianma</param-name> <param-value>utf-8</param-value> </context-param> (2)获得数据属性 public void init(ServletConfig config) throws ServletException { bianhao=config.getServletContext().getInitParameter("bianma"); }

10.servlet3.0

注解(提供给程序读取的信息) -- 注释(提供给程序员看的信息) 注解的格式: @ 开头的 如 :@Override @WebServlet 注解配置 Servlet 从Servlet3.0开始,配置Servlet支持注解方式,但还是保留了配置web.xml方式,所有使用Servlet有两种方式: (1)Servlet类上使用@WebServlet注解进行配置 (2)web.xml文件中配置 1 <servlet> <servlet-name>a</servlet-name> <servlet-class> <!-- 处理类的完整路径 --> com.yhp.web.SelectServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> 通过注解方式配置, web.xml 中不需要配置该 Servlet



2 @WebServlet(name = "myUserServlet", urlPatterns = "/user/test", // 斜杠必须 loadOnStartup = 1, initParams = { @WebInitParam(name="name", value=" 小明 "), @WebInitParam(name="pwd", value="123456") } ) public class UserServlet extends HttpServlet { XXXXX }



WebServlet常用属性 @WebServlet(value="/test1",loadOnStartup=1) (2).name 属性:可以指定也可以不指定,通过 getServletName() 可以获取到,若不指定,则为 Servlet 的完整类 名,如: cn.edu.njit.servlet.UserServlet (3).urlPatterns/value 属性: String[] 类型,可以配置多个映射,如: urlPatterns={"/user/test", "/user/example"} 实例: // 斜杠必须 @WebServlet(loadOnStartup=1,urlPatterns= {"/test1","/test2"}) 2.1 应用启动时, servlet 就会初始化,因为配置了 loadOnStartup=1 2.2 访问 /user/test ,页面上显示结果;表名参数正确初始化以及自定义的 servlet 名称 3. (1).loadOnStartup 属性:标记容器是否在启动应用时就加载 Servlet ,默认不配置或数值为负数时表示客户端第一 次请求 Servlet 时再加载; 0 或正数表示启动应用就加载,正数情况下,数值越小,加载该 Servlet 的优先级越高; (4). 在使用注解方式时,需要注意: 根元素中 不能配置属性metadata-complete="true" ,否则无法加载 Servlet 。 metadata-complete 属性表示通知 Web 容器是否寻找注解,默认不写或者设置 false ,容器会扫描注解,为 Web 应用程序构建有效的元数据; metadata-complete="true" ,会在启动时不扫描注解( annotation )。如果不扫描注解的话,用注解进行的配置 就无法生效, (5).urlPatterns 的常用规则: /*或者/:拦截所有 *.do:拦截指定后缀 /user/test:拦截路径

欢迎报错,能点个赞么 , 么么哒!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是Servlet
  • 2. Servlet API
  • 3. 第一个Servlet
  • 4. Servlet工作原理
  • 5. Servlet的生命周期
  • 6. 请求
  • 7. 响应
  • 8. 会话
  • 10.servlet3.0
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档