您的位置:首页 > 其它

Servlet简介

2017-04-06 12:22 204 查看

什么是servlet

Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:接收请求数据 处理请求 完成响应

实现servlet的方式

实现javax.servlet.Servlet接口;

继承javax.servlet.GenericServlet类;

继承javax.servlet.http.HttpServlet类;

servlet接口里的方法

public void init(ServletConfig config) throws ServletException

public ServletConfig getServletConfig();

public void service(ServletRequest req, ServletResponse res)

throws ServletException, IOException;

public String getServletInfo();

public void destroy();

}

生命周期方法

void init(ServletConfig):创建之后(1次);

void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用;(多次)

void destroy():消亡之前(1次);

特性:

单例,一个类只有一个对象;当然可能存在多个Servlet类!

线程是不并行的,所以它的效率是高的!

Servlet类由我们来写,但对象由服务器来创建,并且由服务器来调用相应的方法。

非生命周期方法:

ServletConfig

ServletConfig是Servlet中的init()方法的参数类型,服务器会在调用init()方法时传递ServletConfig对象给init()方法。

ServletConfig对象封装了Servlet在web.xml中的配置信息,它对应元素。ServletConfig类的功能有:

String getServletName():获取Servlet配置名,即的值;

ServletContext getServletContext():获取ServletContext对象

String getInitParameter(String name):获取初始化参数

Enumeration getInitParameterNames():获取所有初始化参数的名称

<servlet>
的子标签有


<servlet-name>


<servlet-class>


<init-param>


<load-on-startup>


对Servlet的理解

HttpServlet理解

HttpServlet是GenericServlet的子类,实现了GenericServlet中的抽象方法

service(ServletRequest, ServletResponse)会调用本类的service(HttpServletRequest,HttpServletResponse)

service(HttpServletRequest,HttpServletResponse)方法会根请求方式来调用相对的处理方法,例如请求方式为GET,那么该方法会调用doGet()方法,请求方式是POST,那么会调用doPost()方法。所以我们应该去重写HttpServlet的doGet()或doPost()方法。

ServletContext理解

一个Web应用只有一个ServletContext对象,它会在服务器启动时创建,会在服务器关闭时被销毁,它的生命与服务器相同。

通常在整个Web应用中共享数据时可以使用ServletContext对象

还可以使用ServletContext来获取Web资源的真实路径,servletContext.getRealPath(“/WEB-INF/a.jpg”);

ServletContext可以用来资源的MIME类型,例如:servletContext.getMimeType(“a.jpg”),它会返回image/jpeg

请求转发和重定向的异同

请求转发是通过RequestDispatcher对象的forward()方法完成的

重定向是通过HttpServletResponse对象的sendRediect()方法完成的

请求转发是在一个请求中跨越多个动态资源(jsp/servlet),所以多个动态资源之间可以共享request数据

重定向是两次请求,第一次请求服务器响应给客户端的是302,以及Location响应头,通知客户端再次去请求新的资源,所以客户端又发出第二次请求。所以重定向中被请求的多个动态资源之间不能共享request数据。

请求转发后,地址栏的url不会改变,因为是一个请求;

重定向后,地址的rul会改变,因为是两个请求

Servlet细节

1 Servlet与线程安全

因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,所以Servlet不是线程安全的,但是作效率很高!所以我们不应该在Servlet中便宜创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。

如果要创建变量,必须遵循以下规则

不要在Servlet中创建成员!创建局部变量即可!

可以创建无状态成员!

可以创建有状态的成员,但状态必须为只读的!

javaWeb四大域

PageContext;

ServletRequest;

HttpSession;

ServletContext

获取资源相关方法

获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),

realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt;

获取资源流

不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:

获取a.txt资源流:InputStream in = servletContext.getResourceAsStream(“/a.txt”);

获取b.txt资源流:InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);

获取指定路径下的所有路径文件

Set set = context.getResourcePaths(“/WEB-INF”);(开头必须以 / 开头)

可以通过Class类的对象来获取类路径下的资源,对应JavaWeb应用的类路径就是classes目录下的资源

例如:

InputStream in = projectname.MyServlet.class.getResourceAsStream(“a.jpg”);

获取的是:/WEB-INF/classes/servlet/a.jpg,即与MyServlet.class同目录下的资源

例如:

InputStream in = projectnaem.servlet.MyServlet.class.getResourceAsStream(“/a.jpg”);

获取的是:/WEB-INF/classes/a.jpg,即类路径的根目录下的资源,类路径的根目录就是/classes目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: