Servlet


概述:

     Servlet Applet  服务器上的一个小程序, 主要是用来生成动态的web资源servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。要实现此接口,可以编写一个扩展 javax.servlet.GenericServlet 的一般 servlet,或者编写一个扩展 javax.servlet.http.HttpServlet 的 HTTP servlet。此接口定义了初始化 servlet 的方法init()、为请求提供服务的方法service()和从服务器移除 servlet 的方法destroy()。这些方法称为生命周期方法,它们是按以下顺序调用的:- 构造 servlet,然后使用 init 方法将其初始化。(第一次访问的时候执行,如果没有配置在web.xml中配置load-on-startup参数,就是调用了某个servlet的时候它的init()函数才会执行,如果配置了load-on-startup的话,就是在服务器启动的时候,自动执行init()函数。)
    - 处理来自客户端的对 service 方法的所有调用。(每次访问的时候执行)
    - 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它。
         除了生命周期方法之外,此接口还提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。 

Servlet接口里面的5个重要的方法。

servlet的体系结构:

  • HttpServlet中两个service,可以通过查看源码知道,其实执行的时候,从父类继承来的service()方法是调用了子类的service(HttpServletRequest,HttpServletResponse)方法的。所以无论如何都会执行子类的service方法的。而子类的方法里面有两个方法doGet()方法和doPost()方法,其实本质上在执行的时候就是执行doget()方法,可以自己new一个servlet类继承HttpServlet接口就可以看出来了。

    servlet的生命周期:

  • 初始化方法init():第一次访问的时候才会调用
    服务的方法service():每次访问的时候都会调用
    销毁的方法destroy():服务器正常关闭,或者工程从服务器中移除的时候调用、


servlet中的一些api(方法):

servlet中获取请求参数和输出内容:

  • request.getParameter(String name) 从请求对象中获取到参数
    response.getWriter().println(String msg) 向页面中获取参数

详细:
servlet请求对象

  • getParameter(String name),从请求对象中获取参数 以 String 形式返回请求参数的值,如果该参数不存在,则返回
    null。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
           //获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");

ServletResponse
servlet响应对象
getWriter() throws java.io.IOException向页面输出内容
返回可将字符文本发送到客户端的 PrintWriter 对象。PrintWriter 使用 #getCharacterEncoding 返回的字符编码。如果未如 getCharacterEncoding 中所述指定响应的字符编码(即该方法只返回默认值 ISO-8859-1),则 getWriter 会将字符编码更新到 ISO-8859-1。
如:

response.getWriter().println("")response.getWriter().write("please comfirm your information……");

url-pattern的配置:

  • 完全匹配:以/开头
    目录匹配:以/开头,以*结尾
    后缀名匹配: .jsp,.action,.do,.xxx

优先级:完全匹配 > 目录匹配 > 后缀名匹配
一个Servlet可以对应多个路径
一个路径只能够对应一个Servlet

启动参数:
load-on-startup,在启动服务器的时候的时候自动进行初始化,自动调用了init(servletConfig)
数字越小,优先级越高 (一般系统的是1,所以最好自定义的就从2开始好了)
例如,在servers中的web.xml中有一个DefaultServlet,默认就启动了。这个东西是服务于静态的资源。就是静态资源是服务器一启动的时候就加载了。。。

  <servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.itheima.servlet.LoginServlet</servlet-class><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>

load-on-startup是可以写在自己写的servlet里面的。控制他们的加载优先级
这样写上之后,只要在服务器启动的时候就会自动启动。
作用:比如启动定时任务,检查数据库是否存在或者检查表是否存在。

servletConfig
其中getServletContext()重要

下述语句写在servlet标签里面
web.xml:

  <servlet><description></description><display-name>getServletConfigDemo</display-name><servlet-name>getServletConfigDemo</servlet-name><servlet-class>com.itheima.config.getServletConfigDemo</servlet-class><init-param><param-name>username</param-name><param-value>root</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>getServletConfigDemo</servlet-name><url-pattern>/config</url-pattern></servlet-mapping>

getServletConfigDemo:

public class getServletConfigDemo extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletConfig servletConfig = this.getServletConfig();//获取指定参数名参数String username = servletConfig.getInitParameter("username");System.out.println(username);response.getWriter().write("username:"+username);//获取所有参数名字Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();while(initParameterNames.hasMoreElements()){System.out.println(initParameterNames.nextElement());}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

servletConfig中最重要的是getServletContext()

获取上下文/全局上下文/全局管理者
主要作用就是用来共享servlet之间的数据
生命周期:
创建时间:服务器启动的时候就创建了
销毁时间:服务器关闭或者工程被移出的时候就销毁了
在整个应用程序中只有一个实例,保证了所有servlet用的都是相同的内容(单例设计模式)
获取方法:this.getServletContext();
这个方法本质上还是调用this.getServletConfig().getServletContext();

作用:
1)获取全局初始化参数
2)实现资源共享
3)获取资源路径
4)获取文件的mime类型。
5)获取绝对路径
6)获取流

实现资源共享:servletContext

xxxAttribute;setAttribute(key,value)getAttribute(key)removeAttribute(key)
  @Overridepublic void init() throws ServletException {//获取上下文ContextServletContext servletContext = this.getServletContext();servletContext.setAttribute("count", 0);System.out.println("LoginServlet执行了");};

ServletContext
获取文件的mime类型:ServletContext.getMimeType();

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();String f1 = "test.jpg";String mimeType = servletContext.getMimeType(f1);System.out.println(mimeType);}

获取文件的绝对路径:
注意:文件要放在webContent文件夹下
这里要说一下,这个路径其实是从工程下的Web-Content开始写的路径。

         ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/aaa.txt");System.out.println(realPath);

将一个文件读取到一个流中:

        ServletContext servletContext = this.getServletContext();InputStream resourceAsStream = servletContext.getResourceAsStream("/aaa.txt");System.out.println(resourceAsStream);

配置默认工程的默认主页:
web.xml中:

  <welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>

重定向:

//重定向

response.setStatus(302);
response.setHeader("location", "/Day15_0622_03MyLoginDemo/successLogin");

MD5加密
不可逆的加密算法

处理中文乱码问题:
unicode其实就是utf-8
如果是在servlet类中:具有response的类中:
//防止中文乱码

           response.setCharacterEncoding("utf-8");response.setHeader("Content-type", "text/html;charset=utf-8");
或
response.setContentType("text/html;charset=utf-8");

重点api:
getInitParameter(String name) 根据指定名称获取全局/局部初始化参数!调用函数的对象不同,获取的参数就是全局和局部的
用servletContext对象调用的就是全局的,用servletConfig对象调用的就是局部的参数
getInitParameterNames();

全局初始化参数:

例:

  <context-param>                    //全局配置  Context   服务器启动的时候加载配置<param-name>TestContextParam</param-name><param-value>ContextParam01</param-value></context-param><servlet>                         //servlet内部的配置    调用了某个Servlet的时候它的配置才执行。<description></description><display-name>TestServletConfig</display-name><servlet-name>TestServletConfig</servlet-name><servlet-class>com.itheima.servletConfig.TestServletConfig</servlet-class><init-param><param-name>testInitParam</param-name><param-value>InitParam01</param-value></init-param></servlet><servlet-mapping><servlet-name>TestServletConfig</servlet-name><url-pattern>/test</url-pattern></servlet-mapping>

在servlet类中:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取全局配置ServletContext servletContext = this.getServletContext();String initParameter = servletContext.getInitParameter("TestContextParam");System.out.println("get ContextParam:"+initParameter);//获取局部配置ServletConfig servletConfig = this.getServletConfig();String initParameter2 = servletConfig.getInitParameter("TestServletConfig");System.out.println("get ServletConfig"+initParameter2);}

javaEE经典三层架构:

 servlet:控制服务流程service:服务业务dao:dao操作数据库

Day15-servlet相关推荐

  1. Servlet,HTTP,Ruquest,Response

    目录 一.Servlet3.0 1.1好处 1.2步骤 1.3相关配置 二.HTTP协议 2.1请求消息 1. 请求行 2. 请求头 3. 请求空行4. 请求体 2.2响应消息 1. 响应行 2. 响 ...

  2. Java Study Notes_Design in 2023(Day15~)

    文章目录 Day15: 集合进阶(异常.集合) 15.1 认识异常 15.2 自定义异常 15.3 异常处理 15.4 集合概述和分类 15.4.1 集合名称图 15.4.2 集合分类(单列Colle ...

  3. JavaWeb - Servlet实现文件下载漂亮小姐姐视频(文末有小姐姐视频Gif图哦)

    文件下载案例: * 文件下载需求:1. 页面显示超链接2. 点击超链接后弹出下载提示框3. 完成图片文件下载* 分析:1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出 ...

  4. Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常

    我的servlet代码是 try{ //something response.setStatus(201); out.print("Data successfully saved" ...

  5. JavaEE学习笔记之Servlet

    同一用户的不同页面的共享数据 1.1 cookie技术 1.2 sendRedirect()转向 1.3 隐藏表单 1.4 session技术 ###session技术: 当用户打开浏览器,访问某个网 ...

  6. 【JavaWeb】servlet与http请求协议

    Servlet: 概念: server applet (服务端小程序)运行在服务器端的小程序 Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则. 将我我们自定义一个 ...

  7. 使用最新版(2020)IntelliJ IDEA 创建Servlet项目

    一:选择左上端的File,创建Project,选择创建Web Application 项目: 注:不勾选Create web.xml 二:设置项目名称:helloworld,并创建一个Servlet( ...

  8. 2020了,还要学JSP嘛?入个门呗!毕竟Servlet亲兄弟~

    目录 1.什么是JSP 2.JSP原理 3.JSP基础语法 jsp表达式 jsp脚本片段 jsp声明 jsp注释 4.JSP指令 5.JSP行为 6.9大内置对象 7.EL表达式 格式 变量 [ ]与 ...

  9. 来谈谈Servlet~~

    目录 1.Servlet简介 2.第一个Servlet程序 3.Servlet原理 4.servlet-mapping的配置 5.关于ServletContext 1.共享数据 2.获取初始化参数 3 ...

  10. 使用Servlet完成单表的CRUD

    实现步骤 第一步:准备一张数据库表.(sql脚本) 第二步:准备一套HTML页面(项目原型)[前端开发工具使用HBuilder] 第三步:分析我们这个系统包括哪些功能 第四步:在IDEA当中搭建开发环 ...

最新文章

  1. python之Scrapy框架的第一个爬虫
  2. Java Collection
  3. JDBC与ORM发展与联系 JDBC简介(九)
  4. Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用
  5. Transformer的七十二变
  6. 如何实现一套可切换的声网+阿里的直播引擎
  7. java xml出错,Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException...
  8. Emit动态代理.NetCore迁移之旅
  9. C语言 | 函数执行成功时,return 1 还是return 0?
  10. 在HTML5中,用getCurrentPosition()获取用户的当前位置
  11. Python中函数式编程的学习感想~
  12. PPPOE宽带接入技术及常见故障分析
  13. 1.2.1 Milking Cows 挤牛奶
  14. mac终端支持git
  15. 金蝶k3系统中间服务器不可用,【金蝶软件】客户端登陆时提示远程服务器不存在或不可用(金蝶K3系统)...
  16. 数组遍历,forEach(),ever(),some()
  17. iwanna用哪个计算机语言,IwannabetheCreator电脑版
  18. AW笔记本升级SSD,外接双屏中的一些注意事项
  19. java基础巩固-宇宙第一AiYWM:为了维持生计,单例模式阅读总结【单例模式不同写法、在JDK中的应用】~整起
  20. kafka-eagle-2.0.1安装及使用(超详细)

热门文章

  1. 微信证据以及数据恢复删除记录恢复交易恢复
  2. 采购货物和服务的有效步骤
  3. 2 Tables and Table Clusters读书笔记
  4. linux中用zip压缩文件,详解Linux中zip压缩和unzip解压缩命令及使用详解
  5. SPI与I2C总线协议
  6. 算法——暴力之美(volence‘s beautify of algorithm)
  7. elementui自定义进度条形状
  8. R语言心得说:R语言之xlsx包读写Excel数据
  9. 绕过tp路由器管理密码_TP路由器怎么重启 TP-Link无线路由器重启方法【详细介绍】...
  10. 操作系统 chap-5(2) 存储管理