Java Servlet教程– ULTIMATE指南(PDF下载)

Java Servlets是一种基于Java的Web技术。 Java Servlet技术为Web开发人员提供了一种简单,一致的机制,以扩展Web服务器的功能并访问现有的业务系统。

几乎可以将Servlet看作是在服务器端运行的applet,它没有任何表情。 Java servlet使许多Web应用程序成为可能。

Java Servlet构成Java企业版(Java EE)的基本部分。 请注意,Java Servlet必须在兼容Servlet的“ Servlet容器(例如Web服务器)内执行”才能起作用。

本教程可作为基于Java Servlet的代码的全面的入门指南。

目录

1.简介
1.1 Servlet流程 1.2优点
2.生命周期 3.容器
3.1服务 3.2 Servlet容器配置
4.演示:首先 5.筛选
5.1界面 5.2范例
6.会议
6.1会话处理 6.2会话处理机制 6.3范例
7.异常处理
7.1错误代码配置 7.2异常类型配置
8.调试
8.1消息记录 8.2 Java调试器 8.3标头 8.4刷新
9.国际化
9.1方法 9.2范例
10.参考
10.1网站 10.2书
11.结论 12.下载

1.简介

Servlet是Java编程语言类,是Java Enterprise Edition(Java EE)的一部分。 Sun Microsystems在1997年开发了第一个版本1.0。当前版本是Servlet 3.1。

Servlet用于通过扩展服务器的功能在Java中创建动态Web应用程序。 它可以在任何与Servlet容器集成的Web服务器上运行。

1.1 Java Servlet流程

servlet的过程如下所示:

Java Servlet图1:用户请求的servlet处理

图1:用户请求的servlet处理

  • 客户端将请求发送到Servlet容器。 该容器充当Web服务器。
  • Web服务器搜索servlet并启动它。
  • 客户端请求由Servlet处理,并将响应发送回服务器。
  • 然后,服务器响应将转发给客户端。

1.2优点

  • Servlet是独立于平台的,因为它们可以在任何平台上运行。
  • Servlet API继承了Java平台的所有功能。
  • 它为服务器端扩展构建和修改安全逻辑。
  • Servlet继承了Web服务器提供的安全性。
  • 在Servlet中,仅单个请求实例同时运行。 它不会在单独的进程中运行。 因此,它通过消除为每个请求创建新进程的开销来节省内存。

2.生命周期

Servlet生命周期描述Servlet容器如何管理Servlet对象。

  • 加载Servlet类
  • Servlet实例在加载Servlet类时由Web容器创建
  • init() :仅在创建servlet时调用一次。 无需多次调用它。
public void init() throws ServletException {}
  • service() :Web容器调用它来处理来自客户端的请求。 此处完成了代码的实际功能。 每次收到servlet请求时,Web容器都会调用此方法。

它调用doGet()doPost()doTrace()doPut()doDelete()和其他方法

  • doGet()
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
// code
}
  • doPost()
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// code
}
  • destroy() :它用于清理资源,在删除servlet实例之前被调用。
public void destroy()
Java Servlet图2:Servlet生命周期

图2:Servlet生命周期

3.容器

它被称为Servlet引擎,它管理Web服务器顶部的Java Servlet组件,以响应客户端发送的请求。

3.1服务

Servlet容器提供以下服务:

  • 它管理Servlet的生命周期。
  • Servlet,JSP页面和HTML文件等资源由Servlet容器管理。
  • 它将会话ID附加到URL路径以维护会话。
  • 提供安全服务。
  • 它从网络服务,文件系统(例如远程文件系统)和本地文件系统中加载servlet类。

3.2 Servlet容器配置

可以使用Web服务器将servlet容器配置为通过以下三种方式管理servlet:

  • 独立容器
  • 加工容器
  • 后处理容器

独立容器 :这种类型的Web服务器功能由Servlet容器提供。 在这里,容器与Web服务器紧密耦合。

进程内容器 :在此容器中,容器在Web服务器进程内运行。

进程外容器 :在这种类型中,需要将servlet容器配置为在Web服务器进程外部运行。 在某些情况下(例如需要在不同的进程/系统中运行Servlet和Servlet容器)使用它。

4.演示:首先

这是显示Demo Servlet的示例。 请按照以下步骤从NetBeansIDE中的第一个Servlet应用程序开始。

步骤1:打开NetBeansIDE->文件->新建项目-> WebApplication->将项目名称设置为WebApplicationServletDemo

Java Servlet图3:在NetBeansIDE中创建新的WebApplication项目:WebApplicationServletDemo

图3:在NetBeansIDE中创建新的WebApplication项目:WebApplicationServletDemo

步骤2:现在,单击Next>,如上所示。 这将创建具有以下目录结构的新项目。

Java Servlet图4:创建新项目后的项目目录

图4:创建新项目后的项目目录

步骤3:通过右键单击Project Directory-> New-> Servlet创建新的Servlet应用程序

Java Servlet图5:添加Servlet文件

图5:添加Servlet文件

步骤4:将Servlet类名称添加为“ ServletDemo ”,然后单击Next

Java Servlet图6:添加Servlet类名

图6:添加Servlet类名

步骤5:现在,通过选中“ 将信息添加到部署描述符(web.xml) ”并添加URL模式(链接可见)作为ServletDemo 配置Servlet部署。 此步骤将在WEB-INF文件夹中生成web.xml文件。

Java Servlet图7:配置Servlet部署

图7:配置Servlet部署

步骤6:如上图所示,单击Finish,这将在项目目录下添加ServletDemo.java servlet。 检查目录结构下的更改:

Java Servlet图8:配置后项目目录下的更改

图8:配置后项目目录下的更改

这是URL- patter为/ ServletDemo的部署描述符(web.xml)的代码:

清单1:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>ServletDemo</servlet-class>
</servlet>
<servlet-mapping><servlet-name>ServletDemo</servlet-name><url-pattern>/ServletDemo</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30
</session-timeout>
</session-config>
</web-app>

这里,

<servlet-name>: name given to Servlet
<servlet-class>: servlet class
<servlet-mapping>: maps internal name to URL
<url-pattern>: link displays when Servlet runs

超链接被提及作为ServletDemo。 因此,当用户单击它时,页面将重定向到ServletDemo servlet,该servlet的url-pattern被称为ServetDemo

清单2:index.html

<html>
<head>
<title>Welcome</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div><h2>Welcome</h2></div>
<p>We're still under development stage. Stay Tuned for our website's new design and learning content.</p>
<a href="ServletDemo"><b>Next</b></a>
</body>
</html>

清单3:ServletDemo.java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ServletDemo extends HttpServlet {protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");try (PrintWriter out = response.getWriter()) {out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<title>Servlet ServletDemo</title>");            out.println("</head>");out.println("<body>");out.println("<h1>Servlet ServletDemo at " + request.getContextPath() + "</h1>");out.println("</body>");out.println("</html>");}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter(); try {/* TODO output your page here. You may use following sample code. */ out.println("<!DOCTYPE html>"); out.println("<html>");out.println("<head>");out.println("<title>Servlets</title>");out.println("</head>");out.println("<body>");out.println("<br /><p><h2>First Demo Servlet application</h2><br />Here, the URL-pattern is ServletDemo in web.xml. So, the address is <i>WebApplicationServletDemo/ServletDemo</i>.</p>");out.println("<br /><br /><a href=\"index.html\">Previous Page</a>");out.println("</body>");out.println("</html>");} finally { out.close(); }}
}
Java Servlet图9:输出显示index.html欢迎页面

图9:显示index.html欢迎页面的输出

Java Servlet图10:显示重定向到ServletDemo.java的输出

图10:显示重定向到ServletDemo.java的输出

5.筛选

过滤器将请求,响应和标头信息的内容从一种格式转换为另一种格式。 这些是可重用的代码。

  • 过滤器类在部署描述符中声明。
  • 它用于编写可重用的组件。
  • 该请求是使用过滤器调用之前的处理过程。
  • 它可以在Web应用程序下用于某些任务,例如:
    • 验证方式

5.1界面

它由以下3个过滤器组成:

Java Servlet图11:过滤器API接口

图11:过滤器API接口

过滤

这是所有过滤器类都应实现的初始接口和基本接口。 Java.servlet.Filter接口具有以下方法:

方法 描述
init(FilterConfig) 此方法初始化过滤器
doFilter(ServletRequest, ServletResponse, FilterChain) 此方法将服务逻辑封装在ServletRequest上以生成ServletResponse。 FilterChain将请求/响应对转发到下一个过滤器。
destroy() 它破坏了过滤器类的实例。

FilterConfig

过滤器初始化时使用其对象。 部署描述符(web.xml)由配置信息组成。 FilterConfig接口的对象用于获取有关web.xml中指定的过滤器的配置信息。 其方法如下:

方法 描述
getFilterName() 它在web.xml中返回过滤器的名称
getInitParameter(String) 它从web.xml返回指定的初始化参数的值
getInitParameterNames() 它返回过滤器的所有初始化参数的枚举。
getServletContext() 它返回ServletContext对象。

过滤链

它存储有关1个以上过滤器(链)的信息。 在处理请求之前,应根据请求应用此链中的所有筛选器。

5.2范例

这是一个显示NetBeansIDE中的筛选器应用程序的示例。 以与演示部分相同的方式创建一个WebApplication项目WebApplicationFilterDemo 。 右键单击项目目录->新建->过滤器,可以将新过滤器添加到Web应用程序中

Java Servlet图12:向Web应用程序添加新的Filter

图12:将新的过滤器添加到Web应用程序

Java Servlet图13:将类名添加为NewFilter并单击Next

图13:将类名添加为NewFilter,然后单击Next

通过选中“ 将信息添加到部署描述符(web.xml)配置过滤器部署。 现在,由于图13中突出显示的错误,此处的“ 下一步”按钮被禁用。可以通过单击“ 新建 ”来解决“ 输入至少一个URL模式 ”错误。

Java Servlet图14:通过选中“将信息添加到部署描述符(web.xml)”来配置过滤器部署

图14:通过选中“将信息添加到部署描述符(web.xml)”来配置过滤器部署

现在,通过添加URL模式来映射过滤器,如图15所示。

Java Servlet图15:过滤器映射

图15:过滤器映射

添加新的过滤器并单击“确定”后,错误将得到解决。 现在,添加带有名称和值的init参数 。 然后单击完成

Java Servlet图16:添加init参数

图16:添加init参数

清单4:web.xml

可以将Filter NewFilter应用于每个servlet,因为这里为URL模式指定了/ *。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<filter>
<filter-name>NewFilter</filter-name>
<filter-class>NewFilter</filter-class><init-param><param-name>newParam</param-name><param-value>valueOne</param-value></init-param>
</filter>
<filter-mapping><filter-name>NewFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<session-config><session-timeout>30</session-timeout>
</session-config>
</web-app>

清单5:NewFilter.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;public class NewFilter implements Filter {public void init(FilterConfigfilterConfig) {        // init parameterString value = filterConfig.getInitParameter("newParam"); // displaying init parameter valueSystem.out.println("The Parameter value: " + value); }public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// IP address of the client machine.   String remoteAddress = request.getRemoteAddr();// Returns the remote addressSystem.out.println("Remote Internet Protocl Address: "+ remoteAddress);chain.doFilter(request,response);}public void destroy( ){}
}
Java Servlet图17:显示控制台输出

图17:显示控制台输出

6.会议

它是客户端和服务器之间的HTTP请求的集合。 会话在过期时将被销毁,并且其资源将返回给Servlet引擎。

6.1会话处理

这是跟踪会话数据的一种方法。 这表示在会话中传输的数据。 当Web服务器可能需要来自一个会话的会话数据来完成相同或不同会话中的任务时,将使用此方法。 会话处理也称为会话跟踪。

6.2会话处理机制

会话处理有四种机制:

URL重写 :下一个请求中所需的会话数据将附加到客户端用于发出下一个请求的URL路径中。

· 查询字符串:在请求的URI后面附加的字符串是查询字符串。 该字符串后面加上分隔符“?” 字符。

示例1): http://localhost:8080/newproject/login?user=test&passwd=abcde

· 路径信息:它是请求URI的一部分。 可以将会话数据添加到请求URI的路径信息部分。

示例2): http://localhost:8080/newproject/myweb/login;user=test&passwd=abcde

隐藏的表单字段 :一种HTML表单字段,在视图中保持隐藏状态。 其他一些表单字段包括:文本框,密码等。此方法可用于基于表单的请求。 它仅用于从其他不同类型的用户隐藏用户数据。

示例3: <input type="hidden" username="name" value="nameOne"/>

Cookies :它是一个文件,包含服务器发送给客户端的信息。 Cookie通过HTTP响应标头传输到客户端(从服务器)后,将保存在客户端。

当我们想减少网络流量时,cookie被认为是最好的。 它的属性是名称,值,域,版本号,路径和注释。 包javax.servlet.http由一个名为Cookie的类组成。

下面列出了javax.servlet.http.Cookie类中的一些方法:

  • setValue (String)
  • getValue()
  • getName()
  • setComment(String)
  • getComment()
  • setVersion(String)
  • getVersion()
  • setDomain(String)
  • setPath(String)
  • getPath()
  • setSecure(boolean)
  • getSecure(boolean)

HTTP会话 :它提供通过HttpSession对象实现的会话管理服务。

这里列出了一些HttpSession对象方法。 这是从Oracle官方文档中引用的:

方法 描述
public Object getAttribute(String name) 它在此会话中返回与指定名称绑定的对象;如果该名称下未绑定任何对象,则返回null。
public Enumeration getAttributeNames() 它返回String的Enumeration对象,其中包含绑定到该会话的所有对象的名称。
public String getId() 它返回一个字符串,其中包含分配给该会话的唯一标识符。
public long getCreationTime() 它返回创建此会话的时间,以格林尼治标准时间1970年1月1日午夜以来的毫秒数为单位。
public long getLastAccessedTime() 它返回客户端最后一次发送与此会话关联的请求的时间。
public int getMaxInactiveInterval() 它返回最大时间间隔(以秒为单位),servlet容器将在客户机访问之间保持此会话打开。
public void invalidate() 它使该会话无效,然后取消绑定到该会话的任何对象。
public boolean isNew() 如果客户端尚不知道会话,或者客户端选择不加入会话,则返回true。

6.3范例

在此示例下,将打印会话信息,例如会话ID,会话创建时间,上次访问时间等。

清单6:ServletSession.java

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class ServletSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// session object creationHttpSessionnewSession = request.getSession(true);// Session creation time.Date cTime = new Date(newSession.getCreationTime());// The last time the client sent a request.Date lTime = new Date( newSession.getLastAccessedTime());/* sets the time, in seconds, between client requests before the servlet container    invalidates this session */newSession.setMaxInactiveInterval(1 * 60 * 60);String str = "Website | Session";response.setContentType("text/html");PrintWriter out = response.getWriter();String document ="<!doctype html public \"-//w3c//dtd html 4.0 " +"transitional//en\">\n";out.println(document +"<html>\n" +"<head><title>" + str + "</title></head>\n" +"<body bgcolor=\"#bbf5f0\">\n" +"<h2>Website: Displaying Session Information</h2>\n" +"<table border=\"2\">\n" +"<tr>\n" +"  <td>Unique identifier assigned to this session</td>\n" +"  <td>" + newSession.getId() + "</td>"+ "</tr>\n" +"<tr>\n" +"  <td>The time when this session was created</td>\n" +"  <td>" + cTime + "  </td>"+ "</tr>\n" +"<tr>\n" +"  <td>The last time the client sent a request associated with this session</td>\n"+ "  <td>" + lTime + "  </td>"+ "</tr>\n" +"</tr>\n" +"<tr>\n" +"  <td> the maximum time interval, in seconds that the servlet container will keep this session open between client accesses.</td>\n" +"  <td>" + newSession.getMaxInactiveInterval() + "  </td>"+ "</tr>\n" +"</table>\n" +"</body></html>");}
}
Java Servlet图18:显示输出

图18:显示输出

7.异常处理

异常用于处理错误。 这是对无法忍受的条件的反应。 这是web.xml的角色,即用于运行JSP和servlet页面的部署描述。 容器在web.xml中搜索配置以查找匹配项。 因此,在servlet引发异常时,请在web.xml中使用这些异常类型元素与所引发的异常类型进行匹配。

7.1错误代码配置

当出现状态码为403的错误时,将调用/ HandlerClass servlet,如下所示:

清单7:错误代码为403

<error-page><error-code>403</error-code><location>/HandlerClass</location>
</error-page>

7.2异常类型配置

如果应用程序引发IOException,则/ HandlerClass servlet被容器调用:

清单8:对于异常类型IOException

<error-page><exception-type>java.io.IOException</exception-type ><location>/HandlerClass</location>
</error-page>

如果要避免添加单独的元素的开销,请使用java.lang.Throwable作为异常类型:

清单9:对于所有异常,请提及java.lang.Throwable:

<error-page><exception-type>java.lang.Throwable</exception-type ><location>/HandlerClass</location>
</error-page>

8.调试

在Servlet中,大量的客户机/服务器交互。 这使得错误很难定位。 对于位置警告和错误,可以采用不同的方法。

8.1消息记录

提供日志以获取有关警告和错误消息的信息。 为此,使用标准的日志记录方法。 Servlet API可以使用log()方法生成此信息。 使用Apache Tomcat,可以在TomcatDirectory / logs中找到这些日志。

8.2 Java调试器

可以使用JDB调试器(即Java调试器)调试Servlet。 在此,要调试的程序是sun.servlet.http.HttpServer。 设置调试器的类路径以查找以下类:

  • servlet.http.HttpServer
  • server_root / servlet和server_root / classes:通过此调试器,可以在servlet中设置断点。

8.3标头

用户应该具有一些与HTTP标头结构有关的信息。 可以使用它们来判断问题,从而可以进一步定位一些未知错误。 与HTTP标头相关的信息可以帮助您查找错误。 研究请求和响应可以帮助您猜测进展不顺利。

8.4刷新

刷新浏览器的网页,以避免其缓存先前的请求。 在某些阶段,浏览器会显示先前执行的请求。 这是一个已知点,但对于那些工作正常但无法正确显示结果的人来说可能是个问题。

清单21:ServletDebugging.java

在这里,显示了Servlet Debugging,它在Tomcat日志中显示错误。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ServletDebugging extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// parameter "name"String strpm = request.getParameter("name");ServletContext context = getServletContext( );// checks if the parameter is set or notif (strpm == null || strpm.equals(""))context.log("No message received:", new IllegalStateException("Sorry, the parameter is missing."));elsecontext.log("Here is the visitor's message: " +strpm);}
}
Java Servlet图19:在Apache Tomcat日志中可见的输出

图19:在Apache Tomcat日志中可见的输出

9.国际化

在建立全球网站时,要考虑一些重要点,其中包括与用户国籍有关的语言。 国际化使网站能够根据用户的国籍提供以不同语言翻译的内容。

9.1方法

为了查找访客的本地区域和语言,使用了以下方法:

方法 描述
String getCountry() 返回国家代码。
String getDisplayCountry() 返回访问者所在国家/地区的名称。
String getLanguage() 返回语言代码。
String getDisplayLanguage() 返回访问者语言的名称。
String getISO3Country() 返回访问者所在国家/地区的三个字母的缩写。
String getISO3Language() 返回访问者语言的三个字母的缩写。

9.2范例

该示例显示用户的当前语言环境。 在NetBeansIDE中创建以下项目:

Project Name: WebApplicationInternationalization
Project Location: C:\Users\Test\Documents\NetBeansProjects
Servlet: ServletLocale
URL Pattern: /ServletLocale

清单22:ServletLocale.java

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ServletLocale extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//Get the client's LocaleLocale newloc = request.getLocale();String country = newloc.getCountry();// Set response content typeresponse.setContentType("text/html");PrintWriter out = response.getWriter();// this sets the page title and body contentString title = "Finding Locale of current user";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +"transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#C0C0C0\">\n" + "<h3>" + country + "</h3>\n" +"</body></html>");}
}

清单23:具有位置超链接作为URL模式的index.html – ServletLocale

<html>
<head>
<title>User's Location</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body><p>Click on the following link for finding the locale of visitor:</p><a href="ServletLocale"><b>Location</b></a>
</body>
</html>

清单24:带有URL模式为/ ServletLocale的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet><servlet-name>ServletLocale</servlet-name><servlet-class>ServletLocale</servlet-class>
</servlet>
<servlet-mapping><servlet-name>ServletLocale</servlet-name><url-pattern>/ServletLocale</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30
</session-timeout>
</session-config>
</web-app>
Java Servlet图20:显示index.html

图20:显示index.html

Java Servlet图21:将语言环境显示为输出

图21:将语言环境显示为输出

10.参考

10.1网站

  • 官方Oracle文档
  • Sun开发人员网络
  • 免费NetBeans下载
  • 免费Apache下载
  • 免费Java下载

10.2书籍

  • 首要的Servlet和JSP:通过Sun认证的Web组件开发人员考试,作者Bryan Basham,Kathy Sierra和Bert Bates
  • Servlet和JSP(教程),作者Budi Kurniawan

11.结论

与传统的通用网关接口(CGI)相比,Servlet具有快速的性能并且易于使用。 通过本指南,您可以轻松学习与Java Servlet相关的概念。 项目代码是在NetBeansIDE下开发的,因此您还将对它的一些惊人的用户友好功能有所了解。

12.下载

这是有关Java Servlet的教程。

下载
您可以在此处下载本教程的完整源代码: Servlet_Project_Code

翻译自: https://www.javacodegeeks.com/2014/12/java-servlet-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用WSO2开发

几个月以来&#xff0c;我又开始使用WSO2产品。 在接下来的文章中&#xff0c;我描述了我遇到的一些&#xff08;小&#xff09;问题以及如何解决它们。 设置开发环境时&#xff0c;我要做的第一件事是在Mac上下载Developer Studi o&#xff08;64位版本&#xff09;。 解压缩…

CSS揭秘(二)背景与边框

Chapter2 背景与边框 1. 半透明边框 基础&#xff1a;了解 RGBA & HSLA 颜色&#xff08;色调 0~360、饱和度、亮度 &#xff08;0%黑色~100%白色&#xff09;、透明度&#xff09; 默认情况下&#xff0c;背景在边框的下层&#xff0c;容器的背景从半透明的边框透上来并…

Hibernate 拦截器 Hibernate 监听器

Hibernate拦截器(Interceptor)与事件监听器(Listener) 拦截器&#xff08;Intercept&#xff09;&#xff1a;与Struts2的拦截器机制基本一样&#xff0c;都是一个操作穿过一层层拦截器&#xff0c;每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理。  监听器&am…

深入探讨用位掩码代替分支(3):VC6速度测试

wuhanbingwhdx提到了数据相关也会影响流水线&#xff08;http://blog.csdn.net/zyl910/article/details/1330614&#xff09;。  他的说法是有一定道理的。但是&#xff0c;在很多时候我们并不仅仅处理一个数值。比如将循环展开&#xff0c;在内循环处理2个或更多个的数值。而…

Web安全相关(三):开放重定向(Open Redirection)

简介 那些通过请求&#xff08;如查询字符串和表单数据&#xff09;指定重定向URL的Web程序可能会被篡改&#xff0c;而把用户重定向到外部的恶意URL。这种篡改就被称为开发重定向攻击。 场景分析 假设有一个正规网站http://nerddinner.com/&#xff0c;还有一个恶意网站或钓鱼…

自我修复的JVM

这篇帖子是关于一个应用程序的示例&#xff0c;其中解决每个IT问题的第一个解决方案&#xff08;“您尝试过关闭并重新打开它”&#xff09;可能适得其反&#xff0c;弊大于利。 我们没有关闭或重新打开设备的方法&#xff0c;而是拥有一个可以自愈的应用程序&#xff1a;它在…

微信小程序实战–集阅读与电影于一体的小程序项目(八)

31.电影详情页面 movie-template.wxml <view class"movie-container" catchtap"onMovieTap" data-movieId"{{movieId}}"> movie.js onMovieTap:function(event) {var movieId event.currentTarget.dataset.movieid;wx.navigateTo({url…

Resource接口

【转】https://blog.csdn.net/hbtj_1216/article/details/85487787 参考&#xff1a;官方文档 1 简介 Java标准库中的java.net.URL类和标准处理器对于处理低层的资源没有提供很好的功能。例如&#xff0c;并没有提供一个URL的实现能够从classpath或者ServletContext中读取资源等…

JPA实体图

JPA 2.1的最新功能之一是能够使用实体图指定获取计划。 这很有用&#xff0c;因为它允许您自定义使用查询或查找操作检索的数据。 当使用中型到大型应用程序时&#xff0c;通常以不同的方式显示来自同一实体的数据。 在其他情况下&#xff0c;您只想选择最小的信息集即可优化应…

微信小程序实战–集阅读与电影于一体的小程序项目(三)

14.wx.showToast交互反馈 wx.showToast文档 post-detail.js添加个消息提示框 onCollectionTap: function(ev) {var postsCollected wx.getStorageSync(posts_Collected)var postCollected postsCollected[this.data.currentPostId]postCollected !postCollected;postsCol…

Java SE 8新功能介绍:Lambda的遍历,过滤,处理集合和方法增强

在“ Java SE 8新功能导览”系列的这篇文章中&#xff0c;我们将深入解释并探索代码&#xff0c;以了解如何使用lambda表达式和方法引用 遍历集合 &#xff0c;并使用谓词接口过滤它们&#xff0c;实现默认方法在接口中&#xff0c;最后在接口中实现静态方法 。 在上一篇文章“…

C#锐利体验-第八讲 索引器与操作符重载(转)

第八讲 索引器与操作符重载 南京邮电学院 李建忠&#xff08;cornyfield263.net&#xff09; 索引 C#锐利体验 "Hello,World&#xff01;"程序C#语言基础介绍Microsoft.NET平台基础构造类与对象 构造器与析构器方法域与属性索引器与操作符重载 数组与字符串特征与映射…

Java EE 7 / JAX-RS 2.0:具有自定义HTTP标头的简单REST API身份验证和授权

在使用已可用的HTTP协议实施Web服务时&#xff0c;REST带来了很多便利。 通过仅通过指定的URL触发GET&#xff0c;POST和其他HTTP方法&#xff0c;您将确保通过REST服务的响应来完成某些工作。 但是&#xff0c;无论REST给开发人员带来了什么便利&#xff0c;安全性和访问控制的…

easyui树形菜单实现

需求&#xff1a;读取路径配置中的相对路径获取对应的子文件夹及其子文件并形成树形结构&#xff0c;加载xml文件&#xff0c;输入搜索关键字匹配xml里面的value节点的值对应的contact值的集合并进行搜索 例如&#xff1a;输入b&#xff0c;找到xml里面的文本节点等于b的value…

fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory

一、解决方法 右键点击你创建的项目&#xff0c;选择“属性标签”点击属性&#xff0c;弹出“项目属性页”&#xff0c;在左侧找到以下位置 配置属性 --> C/C --> 预编译头&#xff0c;并选择它&#xff1a;在右边的菜单中选择 “创建/使用预编译头”中的“不使用预编…

Telnet初试(本地测试)

win7下开启Telnet功能&#xff1a; 控制面板-程序和功能- 开启服务 然后回车 这样即可完成一次请求 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

您是否真的要加快Maven的编译/打包速度? 那么takari生命周期插件就是答案。

像你们中的许多人一样&#xff0c;我正在使用多模块Maven项目 。 与现有的许多系统相比&#xff0c;这不是一个很大的数目&#xff0c;它具有15个模块&#xff0c;3种不同的耳朵部署&#xff0c;带有属性文件的大量参数化以及大约10万行Java代码。 在开发高峰期&#xff0c;由于…

手机MMI体系结构及其实现

摘自&#xff1a;http://blog.csdn.net/zc2007/article/details/2340436 1引言 MMI&#xff08;ManMachineInter-face&#xff09;&#xff0c;即人机界面&#xff0c;它负责和用户的交互&#xff0c;在必要的时候调用其它模块的功能。MMI模块在整个系统中处于最 高层&#x…

Aspose.Words简单生成word文档

Aspose.Words简单生成word文档 Aspose.Words.Document doc new Aspose.Words.Document(); Aspose.Words.DocumentBuilder builder new Aspose.W…

ubuntu下安装JDK和netbeans

我在ubuntu下安装netbeans十分简单&#xff0c;我下载了jdk-7u1-nb-7_0_1-linux-ml.sh&#xff0c;直接在终端输入 sh jdk-7u1-nb-7_0_1-linux-ml.sh安装的向导就会启动&#xff0c;你只要选择JDK和netbeans安装的目录&#xff0c;向导就自动替你安装jdk和netbeans&#xff0c;…