文章目录
1:Servlet简介
Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法, Servlet和客户的通信采用“请求/响应"的模式。
Servlet可完成如下功能:
-
创建并返回基于客户请求的动态HTML页面。
-
创建可嵌入到现有HTML页面中的部分HTML页面( HTML片段)。
-
与其它服务器资源(如数据库或基于Java的应用程序)进行通信。
1.1 Servlet容器响应客户请求的过程
1:Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第:4步,否则,执行第2步。
2:装载并创建该Servlet的一个实例对象,调用该Servlet的构造器
3:调用Servlet实例对象的init()方法。
4:创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
5:WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet ,并在卸载之前调用Servlet的destroy()方法。
2:Servlet的HelloWorld演示
步骤如下:
1:创建一个HelloServlet类继承Servlet类
public class HelloServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy......");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig.....");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo.");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("init....");
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service.");
}
public HelloServlet() {
System.out.println(" servlet constructor....");
}
}
2:在web.xml中配置和映射Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>JavaWebDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置和映射Servlet -->
<servlet>
<!-- Servlet注册名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- Servlet全类名 -->
<servlet-class>com.atstudying.zlj.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
启动Servers,在浏览器中输入http://localhost:8880/JavaWebDemo/hello观察控制台结果
原理解释
- Servlet程序必须通过Servlet容器来启动运行,并且储存目录有特殊要求,通需要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
- 一个< servlet >元素用于注册一个Servlet,它包含有两个主要的子元素:< servlet-name >和< servlet-class > ,分别用于设置Servlet的注册名称和Servlet的完整类名。
- 一个< servlet-mapping >元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素: < servlet-name >和< url-pattern >,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
3:Servlet的配置和生命周期
从上面运行结果可以知道如下结论:
Servlet容器:运行Servlet,JSP,Filter等的软件环境
- 可以来创建Servlet,并调用Servlet的相关生命周期方法
Servlet生命周期的方法:以下方法都是由Serlvet容器负责调用
- 构造器:只被调用一次,只有第一次清求Servlet时,创建Servlet 的实例。调用构造器,.説明Serlvet的単突例的!!!
- init方法:只被调用一次。在创建好实例后立即被调用。用于初始化当前Servlet.
- service:被多次调用。毎次请求都会调用service方法。实际用于响应请求的
- destroy: 只被调用一次,在当前Servlet 所在的WEB应用被卸载前调用。用于释放当前Servlet 所占用的资源.
3.1 load-on-startup参数
配置在web.xml文件的servlet节点参数中
<servlet>
<servlet-name>secondServlet</servlet-name>
<!-- Servlet全类名 -->
<servlet-class>com.atstudying.zlj.SecondServlet</servlet-class>
<!-- 可以指定Servlet被创建的时机 -->
<load-on-startup>2</load-on-startup>
</servlet>
load-on-startup:可以指定Servlet被创建的时机。若为负数,则在第一次请求时被创建。若为0或正数,则在当前Web应用被Servlet容器加载时创建实例,且数组越小越早被创建。
3.2 Servlet映射的细节
- 同一个Servlet可以被映射到多个URL上,即多个< servlet-mapping>元素的< servlet-name >子元素的设置值可以是同一个Servlet的注册名。
- 在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式: 一种格式是 ( * .扩展名),另一种格式是以正斜杠(/)开头并以(/ *)结尾。
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<url-pattern>/*</url-pattern>
<!-- <url-pattern>*.html</url-pattern>-->
</servlet-mapping>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.3 ServletConfig接口的使用
servlet容器用于在初始化期间向servlet传递信息的servlet配置对象。
1:设置Servlet节点里的初始化参数
web.xml
<servlet>
<servlet-name>secondServlet</servlet-name>
<!-- Servlet全类名 -->
<servlet-class>com.atstudying.zlj.SecondServlet</servlet-class>
<!-- 配置Servlet的初始化参数,且节点必须在 load-on-startup节点的前面-->
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<!-- 可以指定Servlet被创建的时机 -->
<load-on-startup>2</load-on-startup>
</servlet>
2:获取Servlet的节点里的初始化参数
java.lang.String getInitParameter(java.lang.String name)
# 获取具有给定名称的初始化参数的值。
java.util.Enumeration<java.lang.String> getInitParameterNames()
# 返回servlet初始化参数的名称,作为字符串对象的枚举,如果servlet没有初始化参数,则返回一个ation。
java.lang.String getServletName()
# 返回此servlet实例的名称。
SecondServlet .java
public class SecondServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println(" secondservlet init....");
String user=arg0.getInitParameter("user");
String password=arg0.getInitParameter("password");
System.out.println("user:"+user);
System.out.println("password:"+password);
Enumeration< String> names=arg0.getInitParameterNames();
while (names.hasMoreElements()) {
String string = (String) names.nextElement();
System.out.println("name:"+string);
}
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println(" secondservlet service.");
}
public SecondServlet() {
System.out.println(" SecondServlet constructor....");
}
}
3.4 ServletContext接口的使用
- Servlet引擎为每个WEB应用程序都创建一个对应的 ServletContext对象, SenvletContext对象被包含在ServletConfg对象中,调用ServetConfg getServletContext方法可以返回ServletContext对象的引用。
- 由于一个WEB应用程序中的所有Senvlet都共享同一个,ServletContext对象。所以,ServletContext对象被称之为application对象( Web应用程序对象)。
- 功能:
一获取WEB应用程序的初始化参数
一记录日志
一apliation域范围的属性。访问资源文件:
一获取虚拟路所映射的本地路径
一WEB应用程序之间的访问。
—SenvetContex的其他方法
设置初始化参数:可以为所有的Servlet所获取,而Servlet节点的初始化参数只用那个Servlet节点可以获取
# 获取与给定虚拟路径对应的实路径。
java.lang.String getRealPath(java.lang.String path)
# 参数返回一个字符串,该字符串包含指定的上下文范围的初始化参数的值,如果不存在,则返回null。
java.lang.String getInitParameter(java.lang.String name)
# 将上下文的初始化参数的名称作为字符串对象的枚举返回,如果上下文没有初始化参数,则返回空枚举。
java.util.Enumeration<java.lang.String> getInitParameterNames()
# .返回web应用程序的上下文路径。(web应用名称)
java.lang.String getContextPath()
# 以InputStream对象的形式返回位于指定路径上的资源。
java.io.InputStream getResourceAsStream(java.lang.String path)
- 获取当前web应用的初始化参数
# 参数返回一个字符串,该字符串包含指定的上下文范围的初始化参数的值,如果不存在,则返回null。
java.lang.String getInitParameter(java.lang.String name)
# 将上下文的初始化参数的名称作为字符串对象的枚举返回,如果上下文没有初始化参数,则返回空枚举。
java.util.Enumeration<java.lang.String> getInitParameterNames()
1:设置当前web应用的初始化参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>JavaWebDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置当前web应用的初始化参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcurl</param-name>
<param-value>jdbc:mysql/localhost:8080</param-value>
</context-param>
<servlet>
<servlet-name>secondServlet</servlet-name>
<!-- Servlet全类名 -->
<servlet-class>com.atstudying.zlj.SecondServlet</servlet-class>
<!-- 配置Servlet的初始化参数,且节点必须在 load-on-startup节点的前面-->
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<!-- 可以指定Servlet被创建的时机 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
<servlet-name>secondServlet</servlet-name>
<!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
2:获取当前web应用的初始化参数
public class SecondServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println(" secondservlet init....");
ServletContext servletContext=arg0.getServletContext();
String driver=servletContext.getInitParameter("driver");
String url=servletContext.getInitParameter("jdbcurl");
System.out.println("driver:"+driver);
System.out.println("url:"+url);
Enumeration< String> name=servletContext.getInitParameterNames();
while (name.hasMoreElements()) {
String string = (String) name.nextElement();
System.out.println("name:"+string);
}
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println(" secondservlet service.");
}
public SecondServlet() {
System.out.println(" SecondServlet constructor....");
}
}
- 获取当前web应用的某一个文件在服务器上的绝对路径,而不是部署前的路径
# 获取与给定虚拟路径对应的实路径。
java.lang.String getRealPath(java.lang.String path)
1:
public class SecondServlet implements Servlet{
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println(" secondservlet init....");
ServletContext servletContext=arg0.getServletContext();
String string=servletContext.getRealPath("web.xml");
System.out.println(string);
}
//.......
}
- 获取当前web应用的某一个文件对应的输入流
# 以InputStream对象的形式返回位于指定路径上的资源。
java.io.InputStream getResourceAsStream(java.lang.String path)
# path的/为当前web应用的根目录
public class SecondServlet implements Servlet{
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println(" secondservlet init....");
ServletContext servletContext=arg0.getServletContext();
//两种方法获取当前web应用的某一个文件对应的输入流
InputStream inputStream=servletContext.getResourceAsStream("/WebContent/NewFile.html");
System.out.println("1:"+inputStream);
ClassLoader classLoader=getClass().getClassLoader();
InputStream inputStream2=classLoader.getResourceAsStream("");
System.out.println("2:"+inputStream2);
}
//.......
}
4:HTTP
4.1 HTTP简介
- WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
- HTTP是hypertext transfer protocol (超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。
- HTTP协议的版本HTTP/1.0、HTTP/1.1. HTTP-NG
4.2 HTTP会话方式
- 浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
- 浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。
- 浏览器访问的多图网页过程
4.3 HTTP消息
- 响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。
- 一个使用GET方式的请求消息中不能包含实体内容,只有使用POST、PUT和DELETE方式的请求消息中才可以包含实体内容。
4.3.1 HTTP请求消息
请求消息结构:
一个请求行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开
4.3.2 HTTP响应消息
响应消息结构:
一个状态行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开
4.3.3 Get和Post传递参数比较
- 使用GET方式传递参数:
1:在浏览器地址栏中输入某个URL地址或单击网页上的一一个超链接时,浏览器发出的HT TP请求消息的请求方式为GET.
2:如果网页中的< form>表单元素的method属性被设置为了“GET",浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET
3:使用GET请求方式给WEB服务器传递参数的格式: http: //www. atguigu . com/ counter .jsp?name=lc&pas sword=123
4:使用GET方式传送的数据量一般限制在1KB以下。 - 使用POST方式传递参数:
1: POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据: form表单的method 置为POST
2:POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
5:ServletRequest使用
- 定义向servlet提供客户端请求信息的对象。servlet容器创建一个ServletRequest对象,并将其作为参数传递给servlet的服务方法。ServletRequest对象提供的数据包括参数名称和值、属性和输入流。扩展ServletRequest的接口可以提供其他特定于协议的数据(例如HTTP数据)由 HttpServlet 请求 ID。(封装了请求信息,可以从中获取到任何的请求信息)
# 以字符串形式返回请求参数的值
java.lang.String getParameter(java.lang.String name)
# 返回一个java.util.Map映射此请求的参数。
java.util.Map<java.lang.String,java.lang.String[]> getParameterMap()
# 返回字符串对象的枚举,其中包含此请求中包含的参数的名称。
java.util.Enumeration<java.lang.String> getParameterNames()
# 返回一个字符串对象数组,其中包含给定请求参数的所有值,如果该参数不存在,则返回null。
java.lang.String[] getParameterValues(java.lang.String name)
5.1 HttpServletRequest使用
- 扩展ServletRequest接口,为HTTP servlet提供请求信息。
servlet容器创建一个HttpServletRequest对象,并将其作为参数传递给servlet的服务方法(doGet、doPost等)。
# 在HTTP请求的第一行中,从协议名到查询字符串返回此请求的URL的一部分。
java.lang.String getRequestURI()
# 返回路径后请求URL中包含的查询字符串。
java.lang.String getQueryString()
# 返回发出此请求的HTTP方法的名称,例如GET、POST或PUT。
java.lang.String getMethod()
# 返回请求URL中调用servlet的部分。
java.lang.String getServletPath()
举例:
NewFile.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="get">
user: <input type="text" name="user"/>
password:<input type="password" name="password"/>
interesting
<input type="checkbox" name="interesting" value="reading"/>Reading
<input type="checkbox" name="interesting" value="game"/>Game
<input type="checkbox" name="interesting" value="party"/>party
<input type="checkbox" name="interesting" value="shopping"/>shopping
<input type="checkbox" name="interesting" value="sport"/>sport
<input type="checkbox" name="interesting" value="tv"/>tv
<input type="submit" value="submit"/>
</form>
</body>
</html>
login.java
public class Login implements Servlet {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("请求来了。。。");
System.out.println(req);
//获取请求参数的名字
String user=req.getParameter("user");
String password=req.getParameter("password");
System.out.println(user+","+password);
//获取请求中多个参数
String []strings=req.getParameterValues("interesting");
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]+",");
}
Map<String, String[] > map=req.getParameterMap();
for(Map.Entry<String, String[]> entry:map.entrySet()) {
System.out.println("**"+entry.getKey()+","+Arrays.asList(entry.getValue()));
}
HttpServletRequest httpServletRequest=(HttpServletRequest) req;
String requestURI=httpServletRequest.getRequestURI();
System.out.println(requestURI);
String method=httpServletRequest.getMethod();
System.out.println(method);
String queryString=httpServletRequest.getQueryString();
System.out.println(queryString);
String requestpath=httpServletRequest.getServletPath();
System.out.println(requestpath);
System.out.println("getServerName()"+req.getServerName()+","+"getServerPort()"+req.getProtocol());
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>JavaWebDemo</display-name>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.atstudying.zlj.Login</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
<servlet-name>login</servlet-name>
<!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
启动tomacat
6:ServletResponse使用
- 定义一个对象来帮助servlet向客户机发送响应。servlet容器创建一个ServletResponse对象,并将其作为参数传递给servlet的服务方法。(封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现)
# 返回一个可以向客户端发送字符文本的PrintWriter对象。
java.io.PrintWriter getWriter()
# 如果尚未提交响应,则设置发送到客户机的响应的内容类型。
void setContentType(java.lang.String type)
6.1 HttpServletResponse使用
- 扩展ServletResponse接口,在发送响应时提供特定于http的功能。例如,它有访问HTTP头文件和cookie的方法。
- servlet容器创建一个HttpServletResponse对象,并将其作为参数传递给servlet的服务方法(doGet、doPost等)。
# 使用指定的重定向位置URL向客户端发送临时重定向响应并清除缓冲区。
void sendRedirect(java.lang.String location)
Login.java
html和web.xml和上面一个例子一样
public class Login implements Servlet {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("请求来了。。。");
//ServletResponse的使用
PrintWriter printWriter=res.getWriter();
printWriter.println("sucess");
}
}
7:GenericServlet使用
- 定义一个通用的、独立于协议的servlet。要编写一个用于Web的HTTP servlet,可以扩展HttpServlet。
- GenericServlet实现Servlet和ServletConfig接口。GenericServlet可以由servlet直接扩展,尽管扩展特定于协议的子类(如HttpServlet)更为常见。
- GenericServlet简化了servlet的编写。它提供了生命周期方法的简单版本,init和destroy以及ServletConfig接口中的方法。GenericServlet还实现了在ServletContext接口中声明的日志方法。
要编写通用servlet,只需覆盖抽象服务方法。
举例:在web . xml文件中设置两个WEB应用的初始化参数,user, password。定义一个login. htm, 里边定义两个请求字段: user, password. 发送请求到loginServlet,在创建一个LoginServlet类, 在其中获取请求的user, password. 比对其和web .xml 文件中定义的请求参数是若一致,响应Hello:xxx,若不一致,响应Sorry; xxx xxx为userxx
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="loginServlet" method="post">
user:<input type="text" name="username" />
password:<input type="password" name="password" />
<input type="submit" value="submit"/>
</form>
</body>
</html>
LoginServlet .java
public class LoginServlet extends MyGenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
//1: 获取请求参数:username,password
String usernameforhtml=req.getParameter("username");
String passwordforhtml=req.getParameter("password");
//2:获取当前web应用的初始化参数:username,password字符串
ServletContext servletContext=getServletConfig().getServletContext();
String usernameforweb=servletContext.getInitParameter("user");
String passwordforweb=servletContext.getInitParameter("password");
//3:比对
//4:打印响应
PrintWriter out=res.getWriter();
if (usernameforweb.equals(usernameforhtml)&&passwordforweb.equals(passwordforhtml)) {
out.println("hello:"+usernameforhtml);
}else {
out.println("sorry:"+usernameforhtml);
}
}
}
MyGenericServlet .java
/**
* 自定义的一个Servlet接口实现类:让开发的任何Servlet都继承该类。简化开发
* @author 86180
*
*/
public abstract class MyGenericServlet implements Servlet,ServletConfig{
/**
* 以下方法是Servlet实现方法
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return servletconfig;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
private ServletConfig servletconfig;
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
this.servletconfig=arg0;
}
@Override
public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
/**
* 以下方法为ServletConfig接口的方法
* @param arg0
* @return
*/
@Override
public String getInitParameter(String arg0) {
// TODO Auto-generated method stub
return servletconfig.getInitParameter(arg0);
}
@Override
public Enumeration<String> getInitParameterNames() {
// TODO Auto-generated method stub
return servletconfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub
return servletconfig.getServletContext();
}
@Override
public String getServletName() {
// TODO Auto-generated method stub
return servletconfig.getServletName();
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>JavaWebDemo1</display-name>
<context-param>
<param-name>user</param-name>
<param-value>zlj</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
<servlet>
<servlet-name>loginservlet</servlet-name>
<servlet-class>com.atstudying.zlj.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginservlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
</web-app>
8:HttpServlet介绍
- 提供要子类化的抽象类,以创建适合于Web站点的HTTP servlet。HttpServlet的子类必须覆盖至少一个方法,通常是其中之一:
doGet,如果servlet支持HTTP GET请求
doPost,用于HTTP POST请求
doPut,用于HTTP PUT请求
doDelete,用于HTTP删除请求
init and destroy,以管理servlet生命周期中保留的资源
getServletInfo, servlet使用它来提供关于自身的信息
- 几乎没有理由重写服务方法。服务通过将标准HTTP请求分派给每个HTTP请求类型的处理程序方法来处理它们(上面列出的doXXX方法)。同样,几乎没有理由重写doOptions和doTrace方法。
servlet通常运行在多线程服务器上,因此请注意servlet必须处理并发请求,并小心同步对共享资源的访问。共享资源包括内存中的数据(如实例或类变量)和外部对象(如文件、数据库连接和网络连接)。
从HttpServlet底层源码分析,自己定义了MyHttpServlet 类
public class MyHttpServlet extends MyGenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
if (arg0 instanceof HttpServletRequest) {
HttpServletRequest request=(HttpServletRequest)arg0;
if (arg1 instanceof HttpServletResponse) {
HttpServletResponse response=(HttpServletResponse)arg0;
service(request, response);
}
}
}
public void service(HttpServletRequest request,HttpServletResponse response) {
//1:获取请求方式
String method=request.getMethod();
//2:根具请求方式在调用对应的处理方法
if ("GET".equalsIgnoreCase(method)) {
doGet(request,response);
}else if ("POST".equalsIgnoreCase(method)) {
doPost(request,response);
}
}
private void doPost(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
private void doGet(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
}