开发动态Web资源的常见技术有ASP、PHP、JSP、Servlet等。基于Java的动态Web资源开发,Sun公司提供了Servlet和JSP两种技术。
1.Servlet概述
Servlet 是使用Java语言编写的运行在 Web 服务器或应用服务器上的程序。主要作为来自 Web 浏览器或其他 HTTP 客户端的请求(doGet()和doPost() 等方法)和 HTTP 服务器上的数据库或应用程序之间的中间层。
Servlet 由Servlet 容器提供,(Servlet 容器是指提供Servlet 功能的服务器(例如:Tomcat)),Servlet 容器将Servlet 动态地加载到服务器上。
Servlet 应用程序的体系结构:
Servlet的请求首先会被HTTP服务器(如Apache)接收,HTTp服务器只负责静态HTML页面的解析,对于Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet,Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。
Servlet技术的特点:
- 方便:Servlet提供了大量的实用工具例程。
- 跨平台:用Java类编写
- 灵活性和可扩展性:
- 功能强大、能在各个程序之间共享数据、安全性强等
用户若想用发一个动态Web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
- 编写一个Java类,实现servlet接口
- 把开发好的Java类部署到web服务器中
2.Servlet接口及实现类
Servlet技术最重要的接口是 javax.servlet.Servlet
Servlet接口中定义了 5 个抽象方法:
init、service、destroy 、getServletConfig 和 getServletInfo
表中提及的Servlet容器指的是 Web服务器
ServletContext接口的三个主要作用:
- 获取Web应用程序的初始化参数
- 实现多个Servlet对象共享数据
- 读取Web应用下的资源文件
实例问题一:
编写一个servlet,实现统计网站被访问次数的功能?
实现步骤如下:
1)新建一个类ShowTimesServlet继承HttpServlet,重写doGet和doPost方法
2) 在doPost方法中调用doGet方法,在doGet方法中实现统计网站被访问次数的功能,用户每请求一次Servlet,使访问次数times加1
3) 获取ServletContext,通过它的功能记住上一次访问后的次数
3.1)ShowTimesServlet类的编写如下:
public class ShowTimesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context = getServletContext();
Integer times = (Integer) context.getAttribute("times");
if (times == null) {
times = new Integer(1);
} else {
times = new Integer(times.intValue() + 1);
}
//设置编码(UTF-8也行),不然中文会变成乱码
resp.setContentType("text/html;charset=GB2312");
//得到输出流对象
PrintWriter out=resp.getWriter();
out.println("<html><head><title>");
out.println("页面访问统计");
out.println("</title></head><body>");
out.println("当前页面被访问了");
out.println("<font color=red size=20>"+times+"</font>次");
//设置属性,将times保存到当前的上下文中
context.setAttribute("times",times);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
3.2)web.xml配置信息如下
<servlet>
<servlet-name>ShowTimesServlet</servlet-name>
<servlet-class>
cn.itcast.chapter03.servlet.ShowTimesServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowTimesServlet</servlet-name>
<url-pattern>/ShowTimesServlet</url-pattern>
</servlet-mapping>
实例问题二:
编写一段程序,使程序能读取该servlet的配置信息,从中获得参数名为encoding对应的参数值,并输出到页面上?
实现代码如下:
1.TestServlet类如下:
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
// 获得ServletConfig对象
ServletConfig config = this.getServletConfig();
// 获得参数名为encoding对应的参数值
String param = config.getInitParameter("encoding");
out.println("encoding=" + param);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
2.web.xml文件配置如下:
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.itcast.chapter03.servlet.TestServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>