Java Servlet 是一种使用Java 编写的CGI 程序
package cn.mldn.lxh.servlet ;
import java.io.* ;
// HttpServlet 属于javax.servlet 包下
import javax.servlet.* ;
// HttpServletRequest、HttpServletResponse 存放在javax.servlet.http 包下
import javax.servlet.http.* ;
public class SimpleServlet extends HttpServlet
{
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws
IOException,ServletException
{
PrintWriter out = resp.getWriter() ;
out.println("<HTML>") ;
out.println("<HEAD>") ;
out.println("<TITLE>THE FIRST SERVLET</TITLE>") ;
out.println("</HEAD>") ;
out.println("<BODY>") ;
out.println("<H1>Hello World!!!</H1>") ;
out.println("</BODY>") ;
out.println("</HTML>") ;
out.close() ;
}
};
javac -d.SimpleServlet .java 带包编译的命令
// 表示要使用一个Servlet
<servlet>
// 在web.xml 文件内部起作用的名字
<servlet-name>simple</servlet-name>
// Servlet 程序所在的包.类名称
<servlet-class>cn.mldn.lxh.servlet.SimpleServlet</servlet-class>
</servlet>
// Servlet 映射地址
<servlet-mapping>
// 在web.xml 文件内部起作用的名字,此名字与上面的一致
<servlet-name>simple</servlet-name>
// 具体的映射路径
<url-pattern>/demo</url-pattern>
</servlet-mapping>
最基本的 Servlet 架:
package cn.servlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class LifeCycleServlet extends HttpServlet
{
// 初始化 分为无参 和 有参数两种 ·
public void init() throws ServletException //当不需要传递初始化参数时使用,
{
System.out.println("** Servlet 初始化 ...") ;
}
public void init(ServletConfig config) throws ServletException
//init(ServletConfig config):如果有此种初始化方法,则上面的无参数初始化方法无效,当需要传递初始化参数的时候使用此操作
{
}
// 表示处理get 请求
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
}
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws
IOException,ServletException
{
this.doGet(req,resp) ;
}
public void destroy()
{
}
· 配置 web.xml 文件,多个名称匹配一个servlet
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/demo.mldn</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/demo.lxh</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
Servlet 接口 JSP 内置对象
HttpServletRequest request
HttpServletResponse response
ServletConfig config
HttpSession Session,通过request 对象取得 request.getsession()
ServletContext application 取得两种方式(对应两种初始化方法):
· 无参数初始化方法 / 不写,直接取得
· 如果针对有参构造(init(SerlvetConfig))则必须 通过config 对象取得form.htm
<form action="formServlet" method="post">
用户名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>
demo.jsp
<h1><%=session.getAttribute("sname")%></h1>
<h1><%=getServletContext().getAttribute("addr")%></h1>
<h1><%=application.getAttribute("addr")%></h1>
FormServlet .java
package cn.servlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class FormServlet extends HttpServlet
{
private ServletConfig config = null ; //有参数时用来取得application对象
public void init(ServletConfig config) throws ServletException
{
this.config = config ;
}
// 表示处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
// System.out.println("** Servlet doGet处理提交参数 ...") ;
this.doPost(req,resp) ;
}
// 处理post请求
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
String name = req.getParameter("uname") ;
// 取得application对象,有参数的构造函数必须通过下面获得,
// ServletContext app = this.getServletContext() ;
ServletContext app = this.config.getServletContext() ;
app.setAttribute("addr","www.MLDN.cn") ;
// 取得一个session对象
HttpSession session = req.getSession() ;
session.setAttribute("sname",name) ;
// System.out.println("** Servlet doPost处理提交参数 ...") ;
System.out.println("name = "+name) ;
// 重定向
resp.sendRedirect("demo.jsp") ;
}
};
formservlet在web.xml重的配置
/*
<servlet>
<servlet-name>form</servlet-name>
<servlet-class>cn.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/servlet/formServlet</url-pattern>
</servlet-mapping>
*/
理解地址拼凑
因为form.htmform action 写的是formServlet ,而它的地址是http://localhost/test/servlet/form.htm他认为的servlet的地址是
http://localhost/test/servlet/formServlet,因为它在当前目录找, 虚拟目录是http://localhost/test所以在web.xml
中将formservlet匹配的url 前面加了个>/servlet,否则它会认为是http://localhost/test/formServlet
Servlet 的生命周期
1) 产生 Servlet,加载到Servlet Engine中,然后调用 init()这个方法来进行初始化工作。
2) 以多线程的方式处理来自Client 的请求。 service()
3) 调用 destroy()来销毁Servlet,进行垃圾收集 (garbage collection)。
Servlet 从产生到结束的流程
1. 加载和实例化
当Container一开始启动, 或是客户端发出请求服务时, Container会负责加载和实例化一个Servlet。
2. 初始化
Servlet 加载并实例化后,再来Container必须初始化 Servlet。初始化的过程主要是读取配置 信息(例如JDBC连接)或其他须执行的任务。我们可以借助 ServletConfig 对象取得 Container的 配置信息,例如:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>tw.com.javaworld.CH2.HelloServlet</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>browser</param-value>
</init-param>
</servlet>
其中user为初始化的参数名称;browser 为初始化的值。因此,可以在 HelloServlet程序中使用ServletConfig 对象的getInitParameter("user")方法来取得 browser。
3. 处理请求
Servlet被初始化后,就可以开始处理请求。每一个请求由 ServletRequest 对象来接收请求;而ServletResponse对象来响应该请求。
4. 服务结束
当 Container 没有限定一个加载的 Servlet 能保存多长时间,因此,一个 Servlet 实例可能只在Container中存活几毫秒,或是其他更长的任意时间。一旦 destroy( )方法被调用时,Container将移除该 Servlet,那么它必须释放所有使用中的任何资源,若 Container 需要再使用该 Servlet时,它必须重新建立新的实例。