Servlet程序设计(一)

Servlet程序设计
 Servlet程序的基本结构、Servlet声明周期、在Servlet之中取得各主要对象
2、知识点
2.1、上次课程的主要知识点
 1、 DAO设计模式
2.2、本次预计讲解的知识点
 1、 Servlet程序的作用及开发
 2、 Servlet生命周期的作用
 3、 Servlet中操作各个对象
 4、 MVC设计模式
3、具体内容
3.1、什么是Servlet程序?
 Servlet:Java的服务器端小程序,是使用JAVA实现的CGI程序。传统的CGI程序使用的是多进程的处理方式,而使用JAVA实现的CGI程序与传统CGI相比,使用的是多线程的处理方式。
 JSP可以完成的功能Servlet都可以完成,甚至比JSP具备的功能还要更多。
 Servlet程序在开发中分为三种:
  • 简单Servlet:功能与JSP类似
  • 过滤Servlet
  • 监听Servlet
 从时间发展上来说,是先有的Servlet,但是Servlet的输出比较麻烦,所以后来产生了JSP,专门显示页面。
 Servlet本身是直接使用JAVA编写的,所以比起JSP来性能更高,而且与JSP不同的是,Servlet程序运行不受WEB容器的限制,而JSP要受到容器性能的限制。Servlet受本机操作系统的性能限制。
3.2、第一个Servlet程序
 所有的Servlet程序都必须继承HttpServlet类,此类为一个抽象类。
 Servlet本身也是使用JAVA编写的,所以最终Servlet要保存在WEB-INF/classes目录之中。既然是保存在此目录之中,所以如果要想访问,则必须在web.xml中进行配置。
HelloServlet.java:
package org.lxh.demo ;
import javax.servlet.* ;
import javax.servlet.http.* ;
import java.io.* ;
public class HelloServlet extends HttpServlet{
 public void doGet(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
  PrintWriter out = null ;
  out = resp.getWriter() ;
  out.println("<html>") ;
  out.println("<head>") ;
  out.println("<title>") ;
  out.println(" Servlet Demo") ;
  out.println("</title>") ;
  out.println("<body>") ;
  out.println("<h1><font color=\"red\">Hello World!!!</font></h1>") ;
  out.println("</body>") ;
  out.println("</head>") ;
  out.println("</html>") ;
  out.close() ;
 }
};
 从以上的程序中,可以发现如果在Servlet中进行页面的输出,绝对是一种折磨,而且修改起来很麻烦,所以产生JSP。
 一个JAVA程序编好之后,下面就可以对程序进行编译了。
 
 但是在编译的时候出现了以上的错误:错误的提示是,找不到所需要的包。
 原因:现在开发环境使用的是JDK,JDK本身只是属于JAVA SE的应用范畴,但是JAVA EE是在JAVA SE之上构建起来的,那么Servlet属于JAVA EE程序的一种,所以此时肯定无法使用JAVA SE的应用包进行编译。
 那么Tomcat来说,里面有一个JSP的执行流程:*.jsp  *.java  *.class,那么既然里面可以把一个JSP编译成CLASS文件,那么里面就一定有一个包,存在以上的若干种包。
 • D:\Tomcat 5.5\common\lib\servlet-api.jar
 那么如何去使用以上的包呢,有两种方式:
  • 第一种:将此包设置到classpath之中:set classpath=D:\Tomcat 5.5\common\lib\servlet-api.jar
  • 第二种:直接将此包设置到JDK的开发路径之中。
   • C:\Program Files\Java\jdk1.5.0_04\jre\lib\ext
 一个Servlet程序如果要想正确运行,则必须配置web.xml文件,在文件之中对此类文件进行映射的配置。
web.xml:
 表示配置的是一个Servlet程序
 <servlet>
  表示此Servlet配置的名称,与<servlet-mapping>相对应,表示一组
  <servlet-name>hello</servlet-name>
  此servlet所在的包.类名称
  <servlet-class>org.lxh.demo.HelloServlet</servlet-class>
 </servlet>
 表示外部浏览器要访问此Servlet时所需要输入的路径地址
 <servlet-mapping>
  此名称与<servlet>中的名称一致,表示要为那个servlet做映射
  <servlet-name>hello</servlet-name>
  具体的映射地址,表示从根目录下通过he就可以访问此Servlet了。
  <url-pattern>/he</url-pattern>
 </servlet-mapping>
注意:
 只要是*.xml文件修改之后,服务器一定要重新启动。
 程序运行结果如下,直接输入:http://localhost/test/he,就可以进行访问了。
 
 从以上的运行结果,发现Servlet完成的功能与JSP很类似,但是其本身有一个好处,即:一个Servlet可以同时设置多个映射名称。
web.xml:
 <servlet>
  <servlet-name>hello</servlet-name>
  <servlet-class>org.lxh.demo.HelloServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/he</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/he.asp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/he.lxh</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/dd/*</url-pattern>
 </servlet-mapping>
 以上的配置,为一个Servlet映射了四个名称,每个名称都可以进行访问,但是最有意思的就是最后:“*”,表示任何的内容都可以访问。
3.3、使用Servlet接收表单参数
 既然Servlet可以完成和JSP同样的功能,而且在Servler之中,还存在HttpServletRequest对象,那么就一定可以接收表单参数。
InputServlet.java:
package org.lxh.demo ;
import javax.servlet.* ;
import javax.servlet.http.* ;
import java.io.* ;
public class InputServlet extends HttpServlet{
 public void doGet(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
  PrintWriter out = null ;
  out = resp.getWriter() ;
  out.println("<html>") ;
  out.println("<head>") ;
  out.println("<title>") ;
  out.println(" Servlet Demo") ;
  out.println("</title>") ;
  out.println("<body>") ;
  out.println("<h1><font color=\"red\">"+req.getParameter("info")+"</font></h1>") ;
  out.println("</body>") ;
  out.println("</head>") ;
  out.println("</html>") ;
  out.close() ;
 }
};
 配置web.xml文件。
 <servlet>
  <servlet-name>input</servlet-name>
  <servlet-class>org.lxh.demo.InputServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>input</servlet-name>
  <url-pattern>/input</url-pattern>
 </servlet-mapping>
 下面就可以编写表单了,但是编写表单的时候需要注意,此时servlet是配置在根目录之下,所以如果要想方便的访问,则JSP也要保存在根目录下。
inputServlet.htm:
<HTML>
<HEAD><TITLE> New Document </TITLE></HEAD>
<BODY>
<form action="input" method="post">
 请输入内容:<input type="text" name="info">
 <input type="submit" value="提交">
</form>
</BODY>
</HTML>
 但是此时出现了一个错误:
HTTP Status 405 - HTTP method POST is not supported by this URL
 如果将上面的表单提交方式修改为get,则发现内容可以直接显示在页面之中,这是因为在Servlet之中只提供了处理get请求的操作,如果要想处理post,则必须加上post的请求处理方式。
修改InputServlet.java:
package org.lxh.demo ;
import javax.servlet.* ;
import javax.servlet.http.* ;
import java.io.* ;
public class InputServlet extends HttpServlet{
 public void doGet(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
  PrintWriter out = null ;
  out = resp.getWriter() ;
  out.println("<html>") ;
  out.println("<head>") ;
  out.println("<title>") ;
  out.println(" Servlet Demo") ;
  out.println("</title>") ;
  out.println("<body>") ;
  out.println("<h1><font color=\"red\">"+req.getParameter("info")+"</font></h1>") ;
  out.println("</body>") ;
  out.println("</head>") ;
  out.println("</html>") ;
  out.close() ;
 }
 public void doPost(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
  this.doGet(req,resp) ;
 }
};
 之后,表单就可以使用post的提交方式了。
 此时,已经可以完成数据的输入了,但是整个代码里依然存在问题,如果现在表单保存在了一个文件夹之中呢?

 最好的做法是让servlet直接把映射目录配置到此文件夹之中,以后在访问的时候,就必须以地址栏上的完整路径表示一个Servlet。


http://www.mldn.cn/articleview/2008-11-11/article_view_2888.htm

你可能感兴趣的:(Servlet程序设计(一))