当前位置:   article > 正文

servlet

servlet

Servlet

Servlet是Java web 开发的基石,与平台无关的服务器组件(操作系统),它运行在Servlet容器/web应用服务器/Tomcat中,负责与客户端通信

Servlet的功能

1.创建并返回基于客户请求的动态 HTML 页面

2.可以与数据库进行通信

Servlet的使用

Servlet本身是一种接口,存在与Javax.servlet,自定义一个类,实现servlet接口

这个类就具备了接受客户端请求以及做出响应的功能

servlet不能直接访问,但是index.jsp可以直接访问

是因为在编辑配置后编译时,生成一个out文件;out文件将编译的文件提供给Tomcat加载运行,而设置工件时,会给tomcat提供一个目录,而index.jsp文件就在这个目录之下,而servlet文件在下级目录,所以不能直接访问。

当在浏览器输入url时填写out文件下servlet文件路径还是不能直接访问,是因为权限不够。

解决方法:

1.通过映射,在web.WEB-INF.web.xml文件中进行配置

   <servlet>
         <servlet-name>MyServlet</servlet-name>
         <servlet-class>com.southwind.servlet.MyServlet</servlet-class>
     </servlet>
     <servlet-mapping>
         <servlet-name>MyServlet</servlet-name>
         <url-pattern>/myservlet</url-pattern>
     </servlet-mapping>

通过name进行关联,

2.基于注解的方式

直接在servlet文件中写

 package com.southwind.servlet;
 ​
 import javax.jws.WebService;
 import javax.servlet.*;
 import javax.servlet.annotation.WebServlet;
 import javax.swing.text.html.HTML;
 import java.io.IOException;
 @WebServlet("/demo1")
 public class MyServlet implements Servlet {
     @Override
     public void init(ServletConfig servletConfig) throws ServletException {
 //初始化
     }
 ​
     @Override
     public ServletConfig getServletConfig() {
 //        反映一个对象 用来获取servlet本身信息的
         return null;
     }
 ​
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
 //  处理客户端信息的
         System.out.println("lllll");
 //       通过url请求传参(?key-values)
 //        接收信息
       String id =  servletRequest.getParameter("id");
 ​
 //        设置响应类型
         servletResponse.setContentType("text/html;charset=utf-8");
 //        响应返回一句话
         servletResponse.getWriter().write("hello");
 ​
         servletResponse.getWriter().write("你好");
 ​
     }
 ​
     @Override
     public String getServletInfo() {
 //        返回字符串信息
         return null;
     }
 ​
     @Override
     public void destroy() {
 //    卸载销毁
     }
 }
 ​

互联网简单通信

 import javax.servlet.*;
 import javax.swing.text.html.HTML;
 import java.io.IOException;
 ​
 public class MyServlet implements Servlet {
     @Override
     public void init(ServletConfig servletConfig) throws ServletException {
 //初始化
     }
 ​
     @Override
     public ServletConfig getServletConfig() {
 //        反映一个对象 用来获取servlet本身信息的
         return null;
     }
 ​
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
 //  处理客户端信息的
         System.out.println("lllll");
 //       通过url请求传参(?key-values)
 //        接收信息
       String id =  servletRequest.getParameter("id");
       
 //        设置响应类型
     servletResponse.setContentType("text/html;charset=utf-8");
 //        响应返回一句话
         servletResponse.getWriter().write("hello");
 ​
         servletResponse.getWriter().write("你好");
 ​
     }
 ​
     @Override
     public String getServletInfo() {
 //        返回字符串信息
         return null;
     }
 ​
     @Override
     public void destroy() {
 //    卸载销毁
     }
 }
 ​

Servlet的生命周期

有垃圾回收机制

init创建,service服务,destroy 销毁

只创建一个对象反复调用(减少开销)

当程序关闭时执行destory,销毁对象

非静态方法调用方法必须创建对象,而上述代码没有创建对象

上述代码的对象是由Tomcat容器完成,并且是通过反射机制完成。

所以在配置web.xml时使用全类名

反射创建对象一般是调用无参构造器,

 package com.southwind.servlet;
 ​
 import javax.servlet.*;
 import javax.servlet.annotation.WebServlet;
 import java.io.IOException;
 @WebServlet("/demo2")
 public class HelloServleet implements Servlet {
     public HelloServleet () {
         //无参构造器
         System.out.println("创建Servlet");
     }
     @Override
     public void init(ServletConfig servletConfig) throws ServletException {
         System.out.println("初始化");
     }
 ​
     @Override
     public ServletConfig getServletConfig() {
         return null;
     }
 ​
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("实现方法");
     }
 ​
     @Override
     public String getServletInfo() {
         return null;
     }
 ​
     @Override
     public void destroy() {
         System.out.println("释放方法");
     }
 }
 ​

因为java是面向对象的,所以使用方法时必须有对象,当自己不需要创建对象时,一定是程序自己创建一个对象

反射机制创建对象

 package com.southwind.servlet;
 ​
 import java.lang.reflect.Constructor;
 ​
 public class TomcatTest {
     public static void main(String[] args) {//shrows ClassCastException抛出异常
 //                                            不建议抛出,因为异常是抛出给上一级或者虚拟机
 //                                            会造成上述机制压力过大
         String str = "com.southwind.servlet.HelloServleet";
 //        通过反射机制创建对象
 //        通过运行实类,
 //        程序启动,对象的创建都是动态的,类都是来自于静态文件的,虚拟机内存结构
 //        class就是运行实类
         try {
             //因为class类可能不存在,所以要处理异常
             Class clazz = Class.forName(str);
 //          因为它是运行实类,所以可以拿到类的信息
 //            获取构造函数
             Constructor constructor = clazz.getConstructor();
             System.out.println(constructor);
             Object o = constructor.newInstance();
             System.out.println(o);
 //            getconstructor获取构造器,()里不填内容获取无参,
 //            这里抛出异常可能不存在这个方法 constructor构造器
         } catch (Exception e) {//实际上是多态的体现
             e.printStackTrace();//print stack trace 打印跟踪信息
         }
 //        可以简化写法,直接使用父类
 //        catch (ClassNotFoundException e) {
 //            e.printStackTrace();
 //        } catch (NoSuchMethodException e){
 //            e.printStackTrace();
 //        }
         //捕获异常
     }
 }
 ​

ServletConfig

该接口使用来描述Servlert的基本信息的

getServletName 返回Servlet名称,全类名包含包名

getInitParameter 获取init参数的值 (web.xml)

getInitParameterNames 以集合的形式返回所有的intparameter值

通过遍历的方式

getservletcontext 返回servletcontext的上下文,整个servletcontext的管理者信息

使用方法getcontextpath 获取当前应用的名称

方法getserverinfo获取服务器信息

servletconfig与servletcontext的区别

servletconfig作用于某个servlet实例,每个对象都有一个servletconfig

servletcontext作用于整个web应用,一个web对应一个servletcontext,

servlet的层次结构

1.servlet是最顶端的接口

2.GenericServlet

3.HttpServlet

只需要继承httpservlet在开发过程中

HTTP 请求有很多类型

常用的有四种:1.get 读取2.post 保存 3.put 修改 4.delete 删除

RESTful架构会用这四种,

  • GenericServlet 实现 Servlet 接口,同时为它的子类屏蔽了不常用的方法,子类只需要重写 service 方法即可。

  • HttpServlet 继承 GenericServlet,根据请求类型进行分发处理,GET 请求进入 doGet 方法,POST 请求进入 doPost 方法。

  • 开发者自定义的 Servlet 类只需要继承 HttpServlet 即可,重新实现 doGetdoPost 方法。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号