Javaweb基础之Servlet学习
2017-08-28 21:03
507 查看
一、Servlet简介
1.1 什么是Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet是一套规范,也就是说其中的一部分的类抽象成了接口,实际过程中Servlet运行在web服务器中,具体的实现要由web服务器来实现(与JDBC的驱动一个道理)。1.2 Servlet运行机制
浏览器发送一个HTTP请求,HTTP请求由Web容器(服务器)分配给特定的Servlet进行处理,Servlet的本质是一个Java对象,这个对象拥有一系列的方法来处理HTTP请求。常见的方法有doGet(),doPost()等。Web容器中包含了多个Servlet,特定的HTTP请求该由哪一个Servlet来处理是由Web容器中的web.xml来决定的。1.3 Tomcat与Servlet关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品。二、实现javax.servlet.Servlet接口
2.1 Servlet接口的相关方法
(1) ServletConfig getServletConfig:获取Servlet的配置信息(2) String getServletInfo:获取servlet的信息
(3) void init(ServletConfig config) :出生之后执行初始化操作(只执行一次)。
(4) void service(ServletRequest req,ServletResponse res):每次处理请求时都会被调用。
(5) void destory():临终前的处理善后工作,销毁servlet占用的非内存资源。
2.2 Servlet接口的具体实现
2.2.1 实现Servlet接口
@Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init()..."); } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service()..."); } @Override public void destroy() { System.out.println("destroy()..."); } }
2.2.2 配置web.xml文件
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.xxx.myServlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/aServlet</url-pattern> </servlet-mapping>
web.xml中配置Servlet的目的是把访问路径与一个Servlet绑定在一起。如本例配置的就是把com.xxx.myServlet.MyServlet和路径“/aServlet”绑定在一起。
:指定某个Servlet,并给其命名。
:指定访问路径访问的servlet的名称
2.3 Servlet的生命周期
Servlet的生命周期是指Servlet的出生,服务,以及死亡的过程。与Servlet生命周期相关的方法如下:void init(ServletConfig servletConfig):出生时执行初始化操作(只能一次)
void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用。
void destory():关闭服务器时被销毁。
2.3.1 Servlet的出生
服务器会在Servlet第一次被访问时创建Servlet对象(或在服务器启动时创建),一个Servlet类型服务器只创建一个实例。在服务器启动时创建Servlet需要在web.xml的
<servlet>标签中配置
<load-on-startup>2</load-on-startup>),数字2如果有数字1出现时会在其之前执行。数字范围1~9。
2.3.2 Servlet的服务
具体的对数据库的增删改查,当服务器每次接收请求时,都会调用Servlet的service(ServletRequest req,ServletResponse res)方法。service方法可以被多次调用。2.3.3 Servlet的死亡
Servlet在关闭服务器时才会死亡,离去时会调用destory()方法,非内存资源会在destory()中被销毁。2.4 Servlet接口相关参数
ServletRequest和ServletResponse(请求和响应)ServletConfig
ServletConfig对象由tomcat创建,然后传递给Servlet的init()方法,所以可以在init方法中使用ServletConfig对象。
String getServletName():获取Servlet在web.xml中配置的servlet名称()
ServletContext getServletContext():获取ServletContext对象
String getInitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名获取参数值
Enummeration getInitParameterNames():用来获取web.xml中配置的所有初始化参数名称(可遍历打印)
2.4.1 在web.xml文件中初始化参数配置和ServletConfig方法调用
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.xxx.myServlet.MyServlet</servlet-class> <init-param> <param-name>name1</param-name> <param-value>Jack</param-value> </init-param> <init-param> <param-name>name2</param-name> <param-value>Jerry</param-value> </init-param> </servlet> ``` ``` //获取sevlet的名称(在init方法中) System.out.println("servlet的名称"+servletConfig.getServletName()); System.out.println("---------------------"); //获取初始化参数值 System.out.println("获取name1的值:"+servletConfig.getInitParameter("name1")); System.out.println("获取name2的值:"+servletConfig.getInitParameter("name2")); System.out.println("---------------------"); //获取全部的初始化参数 Enumeration e=servletConfig.getInitParameterNames(); while(e.hasMoreElements()){ System.out.println(e.nextElement()); }
三、继承HttpServlet
HttpServlet类是GennericServlet类的子类,提供了对HTTP请求的特殊支持,因而应用更为广泛。3.1 doGet()和doPost()方法
tomcat创建HttpServlet对象,调用HttpServlet的service(HttpServletRequest req, HttpServletResponse resp)方法,并判断当前请求是get还是post,是get调用doGet(),post调用doPost()。3.2 具体实现方法
1.继承HttpServlet
public class AServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=gbk"); resp.getWriter().print("你好呀"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
2.配置web.xml文件
<servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.xxx.test.AServlet</servlet-class> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/servlet/AServlet</url-pattern> </servlet-mapping>
注:调用doPost方法需要表单提交方式为method="post"
四、Servlet与线程安全
因为一个类型的Servlet只有一个实例对象,那么所以可能会出现一个Servlet同时处理多个请求。Servlet不是线程安全的,工作效率较高,但同时也存在线程安全问题。不要在Servlet中创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程进行读操作。
五、标签
是的子元素,用来指定Servlet的访问路径(url),一般以“/”开头,*.x除外。当在同一个中配置多个时,无论访问哪一个路径都可以访问该Servlet。
通配符”*”代表可以匹配任何URL前缀(或后缀)如:
/* 代表匹配所有url
.do:只要后缀是 .do都可以匹配
六、ServletContext
6.1概述
ServletContext(上下文对象)是Java四大域对象之一。服务器会为每一个应用创建一个ServletCotext对象。随着tomcat的启动而产生,随着tomcat的关闭消失。ServletContext对象的作用是整个Web应用的动态资源之间共享的数据。例如AServlet中向ServletContext对象中保存一个值,然后在BServlet中可以获取这个值。6.2 ServletContext对象的获取
在void init(ServletConfig servletConfig)中:servletConfig可以调用ServletContext getServletContext()在HttpServlet中获取ServletContext对象:
因为HttpServlet继承GenericServlet类,而该类中有一个方法 ServletContext getServletContext() ;所以可以在HttpServlet的方法中直接使用this.getServletContext()来获取ServletContext对象。
6.3 获取应用初始化参数
Servlet也可获取初始化参数,但是它的参数是局部参数,也就是说,一个Servlet只能获取自己的初始化参数,不能获取别的Servlet的初始化参数。可以配置公共的初始化参数,为所有的Servlet而用!这个就需要使用ServletContext!
需要在web.xml中配置应用初始化数据
<web-app> ..... <context-param> <param-name>name1</param-name> <param-value>value1</param-value> </context-param> </web-app>
使用ServletContext获取应用初始化数据
ServletContext sc= servletConfig.getServletContext(); String value1 = sc.getInitParamter("name1");
6.4 ServletContext作为域对象的功能
6.4.1.域对象简介
ServletContext对象用来操作数据的方法* void setAttibute(String name,Object value):用来存储一个对象。多次调用setAtrribute(“name1”)会对上一个name1的值产生覆盖效果
* Object getAttribute(String name):获取存储数据name所对应的值 value
* void removeAttribute(String name):移除ServletContext中域属性
* Enumeration getAttributeNames():获取所有的域属性的名称;
Servlet获取资源路径
* 获取绝对路径
ServletContext sc = config.getServletContext();
String realPath = sc.getRealPath(“/a.txt”);
* 获取资源流
ServletContext sc = this.getServletContext();
InputStream is1 = sc.getResourceAsStream(“/a.txt”);
InputStream is2 = sc.getResourceAsStream(“/WEB-INF/b.txt”);
* 获取指定目录下的所有资源路径
ServletContext sc = request.getServletContext();
Set set = sc.getResourcePaths(“/WEB-INF”);
System.out.println(set);
相关文章推荐
- javaweb学习笔记:Servlet开发基础
- JavaWeb基础学习之servlet
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletRequest
- JavaWeb学习笔记-MySQL数据库基础知识
- J2EE的基础学习_jsp_servlet_获得连接池
- JavaWeb学习笔记-Web基础-03
- javaweb学习总结 servlet开发(一)
- JAVAWEB入门之——servlet学习(1)
- JavaWeb学习笔记-java基础-9-javabean(2)
- JSP&Servlet学习笔记(1)Web开发基础理论
- JavaWeb学习记录(八)——servlet获取配置信息
- JavaWeb学习一(Tomcat和基础入门)
- Servlet基础学习
- day_1_14 JavaWeb系列学习总结之BaseServlet和DBUtils的使用
- Servlet学习基础
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletRequest
- JavaWeb学习之Servlet
- 【JAVAWEB学习笔记】26_Linux基础:简介安装、常用命令和JDK、Mysql、Tomcat的安装