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
即可,重新实现doGet
和doPost
方法。