JavaWeb阶段 - Servlet学习总结

Servlet 容器

  • 用来创建Servlet,并调用Servlet生命周期
  • 运行Servlet,jsp,Filter等的软件环境

Servlet及优点

  • Servlet是采用Java语言编写的服务器端java小程序,运行于Web服务器的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态Web内容,本身不可独立运行
  • Servlet是单例的,对象的属性被所有的访问者共享,因此存在线程安全问题
  • 优点
    1.较好的可移植性: 由于Java语言的跨平台和可移植的特点,使得Servlet有较好的可移植性,无须修改代码既可部署在不同的Web服务器上
    2.执行效率高: Servlet针对每一个请求会创建一个线程,而创建线程相对于创建进程来说开销小,因此Servlet与CGI相比,Servlet响应时间更短,效率更高
    3.Servlet可以与Web服务器进行交互
    4.可扩展性强: 由于Servlet是由Java编写Java是健壮、可扩展性强的语言,因此Servlet也拥有这些优点

Servlet 类创建

  • src → New → Servlet → 包名与类名定义 → Next → 初始化参数区域与访问Servlet地址定义 → Next → 初始化方法选择(doGet:get提交访问的方法,doPost:post提交访问的方法) → Finish
  • 包加载: windows → Properties → Java Build Path → Libraries → Add Libraries → Servlet Runtime → Next → 选择 → Finish
  • Servlet 不再用main方法调用,用url-parttern 进行调用,这是Servlet针对地址栏的一个资源地址
  • Servlet查找流程
    • ①地址栏访问站点的资源,查找WebContent(静态资源)里面
    • ②如果有就返回,无则查找web.xml(动态资源)
    • ③在web.xml中,查找对应的servlet-mapping中的url-pattgern标记,如果找不到,返回404错误
    • ④找到则获取对应的servlet-name名字,通过名字找到唯一的一个Servlet标签(找不到则服务器启动错误)
    • ⑤查找对应的servlet-class标记,如果找不到,返回500错误
    • ⑥进入Servlet的生命周期方法

Servlet 生命周期

  • servlet 的生命周期是在 javax.servlet.Servlet 这个接口中定义好的,由 servlet 容器所管理,所以它的初始化阶段是容器调用它的 init 方法来完成的,服务阶段是调用它的 service 方法,而销毁阶段是调用它的 destroy 方法
//servlet 容器启动的过程中,加载servlet
 public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}
  • 构造器实例化
    • 只能调用一次,只有第一次请求 Servlet 时创建 Servlet 实例,可以在容器启动之后立即实例化,也可以在 Servlet 将要处理客户端请求之前实例化
  • 初始化
    • 只能调用一次,使用init()方法初始化,Servlet的class文件被加载并实例化以后,处理客户端请求之前进行初始化
  • 处理客户请求
    • 多次调用,使用service()方法来处理(响应)客户端的请求,service()方法会根据请求的method属性值的不同(get或post方法)来决定是调用doGet()方法还是doPost()方法来完成具体的响应
  • 销毁(卸载): 只能调用一次,使用destory()方法释放当前Servlet所占用的资源,容器需要释放一些内存空间或容器关闭时
  • 回收: 由JVM的垃圾回收器进行垃圾回收

Servlet 容器响应客户请求过程

  • 1.Servlet容器判断是否装载并创建了servlet实例对象,无则执行第二步,有则执行第四步
  • 2.调用servlet构造器,装载并创建servlet实例对象
  • 3.调用servlet实例对象的init()方法(把Servlet对象放入到Servlet容器中)
  • 4.创建用于封装请求的ServletRequest对象和响应的ServletResponse对象,调用service()判断method类型,调用doGet或doPost方法将两个对象作为参数传递出去
  • 5.长时间无访问,Servlet容器调用destory()方法卸载Servlet

Servlet 注册与运行

  • Servlet必须通过Servlet容器启动和运行,且需存储在Web项目\WEB-INF\classes\路径中
  • Servlet必须在web.xml文件中进行注册和映射其访问路径,才能被引擎加载和被外界访问
  • web.xml文件中<context-param>元素用于配置当前web应用程序的初始化参数
    • 子元素<param-name> 设置参数名
    • 子元素<param-value> 设置参数值
  • web.xml文件中<servlet>元素用于注册Servlet
    • 子元素<servlet-name> 设置Servlet名称
    • 子元素<servlet-class> 设置Servlet完整类名
    • 子元素<init-param> 设置Servlet的初始化参数,在<load-on-startup>前
      • 子元素<param-name> 设置参数名
      • 子元素<param-value> 设置参数值
    • 子元素<load-on-startup>
  • web.xml文件中<servlet-mapping>元素用于映射其访问路径
    • 子元素<servlet-name>用于指定Servlet注册名称
    • 子元素<url-pattern>用于指定Servlet对外访问路径(用户访问路径)
    • 注:多个servlet-mapping可设置相同servlet-name,使多个访问路径都能访问相同Servlet,url-pattern通常有两种格式,一种为"*.扩展名",一种为"/开头/*结尾"

Servlet 相关组件

  • Servlet接口对象:封装Servlet的生命周期
    • init() //初始化
    • getServletConfig() //获得ServletConfig对象
    • service() //服务方法
    • destory() //销毁方法
  • ServletConfig接口对象:封装Servlet的配置信息,并且可获得ServletContext对象
    • getInitParameter(String name) //获取指定Servlet参数名的参数值
    • getInitParameterNames() //获取Servlet参数名的Enumeration对象
    • getServletName() //获取servlet的名称
    • getServletContext() //获取ServletContext对象
  • GenericServlet抽象类对象:继承并实现以上两个接口的方法(除service()方法)
  • HttpServlet抽象类对象:继承GenericServlet抽象类
    • 实现GenericServlet抽象类所有方法,项目中真正继承的类
  • ServletRequest接口对象(封装请求信息)
  • HttpServletRequest接口对象(ServletRequest的子接口)
    • String getParameter(String name) //根据请求参数名获取客户端部分Map的参数值
    • String[] getParameterValues(String name) //根据请求参数名获取客户端部分Map的参数值数组
    • Enumeration getParameterNames() //获取请求中包含的参数的枚举名称,类似于ServletContext的getInitParameterNames()方法
    • Map getParameterMap() //获取请求参数的键值对
    • String getRequestURI() //获取请求的url
    • String getMethod() //获取请求方式
    • String getQueryString() //获取url参数部分字符串
    • String getServletPath() //获取请求的Servlet的映射地址
    • getAttribute() //获取request对象AttributeMap数据
    • setAttribute() //设置equest对象AttributeMap中的一个数据
    • removeAttribute() //删除request对象AttributeMap的一个数据
    • getRemoteAddr() //获取远程请求的ip地址
    • getRequestDispatcher() //获取转向的分配器
    • getHeader() //获取远程请求的头部信息
    • setCharacterEncoding() //设置request范围内的编码
    • getCookies() //获取Cookie信息数组
    • getSession() //获取HttpSession对象
    • getServletContext() //获取ServletContext对象
  • ServletResponse接口对象(封装响应信息)
  • HttpServletRequest接口对象(ServletResponse的子接口)
    • getWriter() //获取PrintWriter对象,调用该对象的print()方法,将把print()中的参数直接打印到客户的浏览器上
    • setContentType(“application/msword”) //设置响应的内容类型
    • setCharacterEncoding() //设置response范围内的编码
    • setContentType() //设置响应的文档类型,默认就是html
    • sendRedirect() //重定向方法
    • setHeader() //设置远程请求的头部信息
    • setStatus() //设置响应的状态码
    • addCookie() //为客户端增加一个Cookie信息
  • 转向和重定向区别
    • 重定向是两次请求,两次响应,两次请求的对象是不同的,转向是在服务器内部完成,是一次请求,一次响应
    • 重定向地址栏是最后一个请求的地址,内容是最后一个页面的内容,转向地址栏是第一个请求的地址,内容是最后一个页面的内容
    • 重定向request数据在两次请求中数据不共享,转向request数据可以共享
    • 重定向可以访问外网资源,转向不可以访问外网资源
  • Cookie对象
    • new Cookie(“key”, “value”) //创建
    • getName() //获取key
    • getValue() //获取value
  • Session对象(会话)
    • 一次会话:从登录到登出,所有session是用户对网站(进入到离开)为一次会话
    • UUID.randomUUID() //jsessionid主键生成器(String主键),cookie中存放主键通过主键指定服务器中数据
    • getId() //获取创建的jsessionid
    • getServletContext() //获取ServletContext对象
    • setMaxInactiveInterval() //设置session的最大时间间隔,单位是s
    • getAttribute() //session范围内获取数据(String)
    • setAttribute() //session范围内设置数据(String,Object)
    • removeAttribute() //session范围内删除数据
    • invalidate() //session立刻失效
    • session的生命周期(重要)
      当代码第一次执行request.getSession()开始创建一个session对象.,当代码执行到session.invalidate()session立刻失效,session.setMaxInactiveInterval(时间秒)延时session失效默认30分钟
      也在web.xml中配置session的失效时间
      <session-config> 
      	<session-timeout>15</session-timeout> 
      </session-config>
      
    • cookie与session区别
      • cookie 数据存储在客户端,只能存储字符串,明文存储,不安全
      • session 数据存储在服务器端,可以存储对象,数据安全.,受cookie影响
  • ServletContext接口对象
    • 获取的三种方式
      • session.getServletContext();
      • request.getServletContext();
      • this.getServletContext();
    • Servlet容器为每一个WEB应用程序都创建了一个对应的ServletContext对象,一个WEB应用程序中所有Servlet都共享同一个ServletContext对象,因此被称之为application对象(web应用程序对象)即上下文Servlet
    • 一个网站只有一个ServletContext对象,n个Session对象,n个request对象
    • 设置Web应用程序的初始化参数
    <context-param> 
    	<param-name>参数名</param-name> 
    	<param-value>参数值</param-value> 
    </context-param>
    
    • 获取Web应用程序的初始化参数
      • getInitParameter(String name) //获取指定WEB应用程序参数名的参数值
      • getInitParameterNames() //获取WEB应用程序参数名的Enumeration对象
    • 获取虚拟路径所映射的本地绝对路径
      • getRealPath(String path)
    • 获取当前WEB应用的名称
      • getContextPath()
    • 获取当前WEB应用的某一个文件对应的输入流
      • getResourceAsStream(String path)
    • 获取共享数据
      • getAttribute(String name)
    • 设置共享数据
      • setAttribute(String,Object)
    • 删除共享数据
      • removeAttribute(String name)
    获取properties文件
    // 这种方法的默认读取路径就是Web应用的根目录
    InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");//也可为相对路径
    // 类加载器的默认读取路径是src根目录
    InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")
    // 创建属性对象
    Properties properties = new Properties();
    properties.load(stream);
    String name = properties.getProperty("name");
    String password = properties.getProperty("password");
    out.println("name="+name+";password="+password);
    
  • 状态码
    • 200: 表示页面正常响应
    • 400: 表示请求的参数错误
    • 404: 表示请求的资源找不到
    • 405: 表示没有权限访问资源
    • 500: 表示服务器端程序有错误

get&post请求

  • 从浏览器向 Web 服务器传递信息有两种方法即get&post
  • GET方法传参
    • 在浏览器地址中输入某个URL地址(location.href发起请求)
    • 单击网页中的超链接
    • form表单的method属性设置为GET
    • 传递参数时会将参数显示在浏览器地址栏
    • Servlet 使用 doGet() 方法处理这种类型的请求
  • POST方法传参
    • form表单的method属性设置为POST
    • 传递参数时会将参数显示在浏览器地址栏
    • Servlet 使用 doPost() 方法处理这种类型的请求
  • 区别
    • post比get信息更加安全
    • get方式传递数据量有限制在2kb~4kb之间,post方式无限制
    • get提交中文不乱码,post提交中文乱码,需编码处理
    • 编码处理:request.setCharacterEncoding(“UTF-8”);
      response.setContentType(“text/html; charset=UTF-8”)
  • 地址
    • url地址: 从协议开始到资源结束
    • uri地址: 从项目名称开始到资源结束
    • 相对地址: 相对于当前文件的位置
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值