欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入浅出Servlet编程教程

时间:11-21 现代故事 提交错误

这篇文章给大家聊聊关于深入浅出Servlet编程教程,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

Jsp将java程序段(Scriplets)和jsp标签(tags)插入到传统的HTML代码中。

Servlet应用程序需要在Servlet容器中运行。 Jetty 和Tomcat 等典型容器运行servlet 应用程序。 Servlet 和静态内容可以在容器中同时运行。

servlet/JSP应用架构servlet API主要由以下工具包组成:

1.javax.Servlet包含Servlet和Servlet容器之间契约的类和接口

2.javax.Servlet.http包含定义HTTP Servlet(使用HTTP协议的Servlet)和Servlet容器之间契约的类和接口。

3.avax.servlet.annotation,包含Servlet、Filter、Listener的注解。它还定义了带注释的组件的元数据。

javax.servlet.descriptor,其中包含为编程登录Web 应用程序提供配置信息的类型。

接口2 javax.Servler包中的Servlet接口

这些方法包括:

1.init(ServletConfig config) 该方法在Servlet被请求一次时调用,此后不会再次调用。传入的参数是Servlet的配置信息

2.service(ServletRequest req,ServletResponse res) 每当请求Servlet时,Servlet容器都会调用此方法。编写代码时,假设将在此处请求servlet。当第一次请求Servlet时,Servlet容器会调用init方法和Service方法。后续请求只会调用Service方法。

3.destroy() 当Servlet要被销毁时,Servlet容器会调用该方法。当要卸载应用程序或要关闭Servlet 容器时,会发生这种情况。一般清理代码都写在这个方法中。

4. ServletConfig getServletConfig() 该方法将返回Servlet容器传递给init方法的ServletConfig

5. String getServletInfo() 该方法将返回Servlet的描述。

ServletRequest接口封装请求数据

1. Object getAttribute(String name) 返回名为name 的属性的值。如果不存在,则返回null。

2.枚举getAttributeNames();返回请求中所有可用属性的名称。返回枚举的集合

3. voidremoveAttribute(字符串名称);删除请求中名为name的属性

4. void setAttribute(String key,Object val);在请求中保存键值对。

5. getCharacterEncoding() 返回请求体中使用的字符编码的名称

6. int getContentLength() 返回请求正文的长度(以字节为单位)。

7. String getContentType() 返回文本的MIME类型

8.ServletInputStream getInputStream()

9.BufferedReader getReader()

10.String getLocalAddr() 返回接收请求的网络接口的IP 地址。

11.String getRemoteAddr() 返回发送请求的客户端或最后一个代理服务器的IP地址

12. String getRemoteHost() 返回客户端或最后发送请求的代理服务器的完全限定名称

13. String getLocalName() 返回接收请求的IP接口的主机名

14. int getLocalPort() 返回接收请求的网络接口的IP端口号

15. int getRemotePort() 返回客户端或最后发送请求的代理服务器的IP 源端口。

16 String getParameter(String name) 返回请求中name参数的值。如果name 参数有多个值,则此方法返回值列表中的第一个值。如果请求中没有找到该参数,则返回null。

17 枚举getParameterNames() 返回请求中包含的所有参数的名称。

18 String[] getParameterValues(字符串名称);返回请求中name参数的所有值

19 String getProtocal() 返回请求使用的协议的名称和版本,例如: HTTP/1.1

20.RequestDispatcher getRequestDispatcher(String path) 返回RequestDispather对象,作为路径定位的资源的封装。

21. String getServerName() 返回请求发送到的服务器的主机名

22 int getServerPort() 返回请求发送到服务器的端口号

23. setCharacterEncoding(String env) 覆盖请求正文中使用的字符编码的名称。 (链接:http://www.jianshu.com/p/d718a5f4a850)

ServletResponse接口,用于封装响应数据

lushBuffer() 强制将缓存中的任何内容发送到客户端

int getBufferSize() 返回实际用于响应的缓冲区的大小。如果没有使用缓冲区,该方法返回0

String getCharacterEncoding() 返回响应中发送的正文中使用的字符编码(MIME 字符集)

String getContentType() 返回用于响应中发送的正文的MIME 类型

ServletOutputStream getOutputStream()

PrintWriter getWriter()

boolean isCommited() 返回一个布尔值,指示响应是否已提交。

void reset() 清除缓存中的所有数据,包括状态代码和消息头。

void resetBuffer() 清除缓存中的响应内容,保留状态码和消息头。

void setBufferSize(int size) 设置响应正文的缓存大小。

void setCharacterEncoding(String charset) 设置发送到客户端的响应的字符编码

void setContentLength(int len) 设置内容体的长度

void setContentType(String type) 设置要发送到客户端的响应的内容类型。例如:"text/html;charset=UTF-8"

Servlet配置

Servlet容器在初始化时使用ServletConfig对象向Servlet传递配置信息,一个ServletConfig对象。

String getInitParameter(字符串名称);返回名为name 的初始化参数的值。初始化参数在web.xml配置文件中配置。

枚举getInitParameterNames() 返回Servlet 所有初始化参数名称的枚举集合。

ServletContext getServletContext() 返回对Servlet 上下文对象的引用。

String getServletName() 返回Web 应用程序的部署描述符中指定的Servlet 实例的名称。

编写Servlet实际上就是编写一个实现javax.servlet.Servlet接口的类。

通用Servlet

如果要写一个通用的Servlet,只需要继承GenericServlet,并实现抽象方法service();

String getInitParameter(字符串名称)

枚举getInitParameterNames();

ServletContext getServletContext()

初始化(ServletConfig配置)

HttpServlet

在绝大多数网络应用中,客户端通过HTTP协议访问服务器端资源。我们编写的Servlet主要用于HTTP协议的请求和响应。为了快速开发应用于HTTP 协议的Servlet 类,Sun 公司的javax.servlet.http 包为我们提供了一个抽象类HttpServlet,它继承自GenericServlet 类,用于创建适合WEB 站点的HTTP Servlet。

公共无效服务(ServletRequest req,ServletResponse res);

protected void 服务(HttpServletRequest req、HttpServletResponse resp)

对于HTTP1.1定义的七种请求方法:GET、POST、HEAD、PUT、DELETE、TRACE、OPTION、

HttpServlet提供了7种处理方法

doGet(HttpServletRequest req,HttpServletResponse resp)

doPost(HttpServletRequest req,HttpServletResponse resp)

.

当容器收到对HttpServlet 对象的请求时,调用该对象中的方法的顺序如下:

调用公共service()方法

在public service()方法中,首先将参数类型转换为HttpServletRequest和HttpServletResponse,然后调用受保护的service()方法并将转换后的对象作为参数传递

在受保护的服务方法中,首先调用HttpServletRequest对象的getMethod方法获取HTTP请求方法的名称,然后根据请求方法的类型调用对应的doXxx()方法。

HttpServlet请求

继承自javax.servlet.servletRequest,该接口新增方法如下:

String getContextPath() 返回请求URI 中表示请求上下文的部分。上下文路径是请求URI 的开始部分。

Cookie[] getCookies() 返回本次请求中客户端发送的所有Cookie 对象

String getHeader(String name) 返回名为name 的请求头的值

枚举getHeaderNames() 返回此请求中包含的所有标头名称的枚举集合。

Enumeration getHeaders(String name) 返回名为name的请求头的所有值的枚举集

String getMethod() 返回此请求中使用的HTTP 方法的名称

String getServletPath() 返回调用Servlet 的请求URI 部分

HttpSession getSession() 返回与此请求关联的Session

HttpSession getSession(boolean create) 返回与此请求关联的会话。如果没有为客户端分配Session,并且create参数为true,则创建一个新的Session。如果为false,则该请求没有有效的HttpSession。返回空值

HttpServlet响应

该接口继承ServletResponse,新增方法如下

addCookie(Cookie cookie)

addHeader(字符串名称,字符串值);

布尔包含标题(字符串名称)

编码重定向URL(字符串网址)

使用SessionID 对重定向的url 进行编码,以便在sendRedirect() 方法中使用

encodeURL(String url) 使用SessionID指定的url编码

sendRedirect(String location) 向客户端发送临时重定向响应,以允许客户端访问新URL

(链接:http://www.jianshu.com/p/d718a5f4a850)

Servlet配置接口

当Servlet容器初始化Servlet时,Servlet容器将ServletConfig对象传递给Servlet的init方法。 ServletConfig通过@WebServlet注解或部署描述符封装了传递给Servlet的配置信息(@WebServlet注解和部署描述符将在后面的文章中讨论)。传入的每条信息称为初始参数。初始参数有两个元素:键和值。您可以使用getServletConfig 来获取传递给Servlet 的ServletConfig。

为了从Servlet内部获取初始参数的值,必须在Servlet容器传递给Servlet的init方法的ServletConfig中调用getInitParameter方法。 ServletConfig还提供了另一个有用的方法:getServletContext。此方法可用于从Servlet 内获取ServletContext。

(链接:http://www.jianshu.com/p/136fb6bf9ed6)

4.ServletContext接口

ServletContext代表Servlet应用程序的上下文,每个应用程序只有一个上下文。在应用程序同时部署到多个容器的分布式环境中,每个Java虚拟机上的Web应用程序都会有一个ServletContext对象。

ServletContext可以通过调用ServletConfig中的getServletContext方法获取。使用ServletContext,您可以共享从应用程序中的所有源访问的信息并动态注册Web 对象。 ServletContext 将对象保存在内部Map 中。存储在ServletContext 中的对象称为属性。

链接:http://www.jianshu.com/p/136fb6bf9ed6

曲奇饼

Cookie 是网络服务器保存在用户浏览器上的小文本文件,其中可以包含有关用户的信息。每当用户连接到服务器时,网站就可以访问cookie 信息。 Cookie 是HTTP 标头的一部分,其传输由HTTP 协议控制。此外,您还可以控制cookie 的有效时间。

您可以通过将两个参数(名称和值)传递给Cookie 类的构造函数来创建cookie:

Cookie cookie=new Cookie(名称, 值);

创建Cookie对象后,可以使用setMaxAge方法设置maxAge属性,该属性决定cookie何时过期。

要将cookie发送到浏览器,需要调用HttpServletResponse的add方法。

如果服务器想要读取浏览器提交的cookie,可以使用HttpServletRequest接口的getCookies方法。该方法返回一个Cookie 数组,如果没有cookie,则返回null。您需要遍历整个数组来查询具有特定名称的cookie。

目前,无法通过名称获取cookie 来让事情变得更容易。此外,没有直接的方法可以删除cookie。你只能创建一个同名的cookie,将maxAge属性设置为0,并将其添加到HttpServletResponse接口中,如下所示:

Cookie cookie=new Cookie("用户名", "");

cookie.setMaxAge(0);

响应.addCookie(cookie);

现在让我们编写一个Servlet,它使用cookie 来帮助统计用户访问某个页面的次数:

com.mc.hello 包;

导入java.io.IOException;

导入java.io.PrintWriter;

导入javax.servlet.ServletException;

导入javax.servlet.http.Cookie;

导入javax.servlet.http.HttpServlet;

导入javax.servlet.http.HttpServletRequest;

导入javax.servlet.http.HttpServletResponse;

公共类CookieDemoServlet 扩展HttpServlet {

私有静态最终长serialVersionUID=1L;

public void doGet(HttpServletRequest 请求,HttpServletResponse 响应)

抛出ServletException、IOException {

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html");

PrintWriter 输出=response.getWriter();

整数计数=0;

Cookie[] cookies=request.getCookies();

if(cookies!=null) {

对于(Cookie cookie : cookie){

if(cookie.getName().equals("VisitCount")) {

count=Integer.parseInt(cookie.getValue());

休息;

}

}

}

计数++;

out.print("这是您"+计数+"访问此页面的时间");

Cookie cookie=new Cookie("VisitCount", "" + count);

响应.addCookie(cookie);

}

}

web.xml中的配置:

cookiecom.mc.hello.CookieDemoServletcookie/cookie

在浏览器地址栏输入http://localhost:8080/HelloWorld/cookie可以看到如下页面:

显示访问次数的页面

此页面每次刷新,访问量都会增加。但是当我们关闭浏览器,然后再次打开浏览器,输入这个页面的URL时,页面上显示的访问次数仍然是1。这是因为我们没有设置cookie的过期时间,当我们关闭浏览器时cookie就过期了。这里我们设置这个cookie的过期时间为3分钟:

Cookie cookie=new Cookie("VisitCount", "" + count);

cookie.setMaxAge(3 * 60);

响应.addCookie(cookie);

这样,无论我们是否关闭浏览器,cookie在3分钟内都不会过期。

会话接口

会话是另一种记录客户端状态的机制。与Cookie 将客户端状态保存在客户端浏览器中不同,Session 将客户端状态保存在服务器上。当客户端浏览器访问服务器时,服务器会以某种形式将客户端信息记录在服务器上。当客户端浏览器再次访问时,只需要从Session中查找客户的状态即可。

HttpSession接口是Java对Session机制的实现规范,位于javax.servlet.http包中。

当用户第一次访问网站时,会自动创建HttpSession 对象。您可以通过调用HttpServletRequest的getSession方法来获取该对象。 getSession 有两个重载方法:

HttpSession getSession()

HttpSession getSession(布尔创建)

不带参数的getSession 方法将返回当前的HttpSession。如果当前没有HttpSession,则创建一个并返回它。 getSession(false) 返回当前的HttpSession。如果当前会话不存在,则返回null。 getSession(true) 与不带参数的getSession 方法一致。它还返回当前的HttpSession。如果当前没有HttpSession,请创建一个。

可以通过HttpSession的setAttribute方法将值放入HttpSession中。方法签名如下:

void setAttribute(字符串名称,对象值)

调用setAttribute方法时,如果传入的name参数之前已经被使用过,则新值会覆盖旧值。

可以通过调用HttpSession的getAttribute方法来检索之前放置的对象。该方法的签名如下:

对象getAttribute(字符串名称)

请注意,存储在HttpSession 中的所有数据都不会发送到客户端。

可以通过调用HttpSession的getId方法读取Session ID。 Servlet 容器为每个HttpSession 生成一个唯一的标识符,并为此标识符创建一个名为JSESSIONID 的cookie。在后续请求中,浏览器将标识符提交给服务器,以便服务器可以识别哪个用户发起了请求。

以下是使Session 失效的几种方法:

在项目的部署描述符文件中设置:

1

会话将在最后一次访问后一分钟过期

直接在应用服务器中设置。如果是tomcat,可以在tomcat目录下的conf/web.xml中找到该元素。 tomcat的默认设置是30分钟。只需修改这个值即可。

调用HttpSession 上的setMaxInactiveInterval 方法来设置其超时时间:

void setMaxInactiveInterval(int 秒)

调用HttpSession 的invalidate 方法强制会话过期。

接下来我们编写一个程序来创建Session:

com.mc.hello 包;

导入java.io.IOException;

导入java.io.PrintWriter;

导入javax.servlet.ServletException;

导入javax.servlet.annotation.WebServlet;

导入javax.servlet.http.Cookie;

导入javax.servlet.http.HttpServlet;

导入javax.servlet.http.HttpServletRequest;

导入javax.servlet.http.HttpServletResponse;

导入javax.servlet.http.HttpSession;

@WebServlet(urlPatterns={ "/mysession" })

公共类SessionDemoServlet 扩展HttpServlet {

私有静态最终长serialVersionUID=36L;

public void doGet(HttpServletRequest 请求,HttpServletResponse 响应)

抛出ServletException、IOException {

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html");

PrintWriter 输出=response.getWriter();

HttpSession 会话=request.getSession();

session.setAttribute("name", "maconn");

Cookie[] cookies=request.getCookies();

if(cookies!=null) {

对于(Cookie cookie : cookie){

out.print(cookie.getName() + "=" + session.getId());

}

}

别的

out.print("没有cookie");

}

}

用户评论

绝版女子

学完 servlet 就觉得 Java 真香!

    有13位网友表示赞同!

軨倾词

准备开始学习 servlet,希望能掌握这门技术。

    有20位网友表示赞同!

淡抹烟熏妆丶

想问一下,servlet 是 web 应用开发必备的吗?

    有15位网友表示赞同!

海盟山誓总是赊

Servlet 和 Spring 有什么区别?哪种更适合初学者?

    有16位网友表示赞同!

不离我

最近在看 Servlet 的资料,发现语法有点复杂...

    有20位网友表示赞同!

独角戏°

学习 Servlet 过程枯燥吗?有什么好的学习资源可以推荐?

    有13位网友表示赞同!

冷风谷离殇

Servlet 开发感觉挺高效的,值得深入学习。

    有9位网友表示赞同!

陌然淺笑

之前用过 JSP ,Servlet 是它的基础吗?

    有6位网友表示赞同!

执笔画眉

网上有很多 Servlet 的教程,但是不知道哪家机构的更靠谱...

    有19位网友表示赞同!

娇眉恨

想问一下,servlet 是做什么用的?有简单解释吗?

    有14位网友表示赞同!

无望的后半生

学习 servlet 可以让我更好地理解 web 应用的运作机制。

    有11位网友表示赞同!

淡淡の清香

Servlet 学习需要用到什么环境搭建呢?

    有8位网友表示赞同!

莫名的青春

有没有人能分享一些自己学 Servlet 的经验和心得?

    有13位网友表示赞同!

安陌醉生

Servlet 的应用场景挺广泛吧,未来前景怎么样?

    有18位网友表示赞同!

半梦半醒半疯癫

学完 servlet 能做些什么类型的项目呢?

    有11位网友表示赞同!

青袂婉约

学习 servlet 难度高吗?我现在的 Java 基底不太扎实...

    有8位网友表示赞同!

﹏櫻之舞﹏

想利用 Servlet 做一些简单的 web 应用练习,不知道从哪里开始合适...

    有6位网友表示赞同!

江山策

Servlet 和 Node.js 有什么区别?

    有20位网友表示赞同!

←极§速

我觉得编程学习真的需要坚持不懈!比如现在正在学 servlet ...

    有9位网友表示赞同!

怀念·最初

期待能够通过学习 servlet 拓宽自己的技能范围。

    有8位网友表示赞同!

心已麻木i

Servlet 作为后端技术,确实很实用。

    有10位网友表示赞同!

【深入浅出Servlet编程教程】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活