JavaServlet基础
JSP根基是servlet技术,在JSP技术出现之前,web应用开发人员自己编写创建servlet对象的类,负责编译和复制字节码到特定目录,从而响应用户请求。JSP屏蔽了servlet对象创建的过程,开发者只需要关心jsp页面本身结构和设计。
需要将tomcat安装目录中的servlet-api.jar放到jdk的lib/ext中。
1 基本准备
1.1 编写
写一个创建servlet对象的类就是编写一个特殊类HttpServlet(在javax.servlet.http包中)的子类。HttpServlet类实现了Servlet接口,实现了响应用户的方法。
写好后编译,然后将字节码保存到classes下的响应目录中。这取决于定义serlvet对象的类所在包,这和bean有几分类似。
1.2 web.xml
编写好了servlet对象的类,那么在使用前,需要知道如何访问这些类,就像使用bean一样。这种对应访问关系在服务目录的WEB-INF下的web.xml中定义,也就是说servlet对象是针对服务目录生成的。
servlet-class:servlet类名,包含了classes下的包路径
servlet-name:tomcat服务器创建的servlet对象名
servlet-mapping中的url-pattern:servlet对象的访问名
在使用和访问的时候,都是使用 servlet-mapping的url-pattern中的访问名。
2 servlet对象工作
servlet对象由Tomcat服务器负责管理,通过读取web.xml创建并运行servlet对象。
servlet对象声明周期:
1)初始化servlet对象。由对象调用init方法完成
2)servlet对象调用service方法相应用户请求
3)服务器关闭,调用destroy方法,销毁servlet对象
3 访问servlet
表单访问;浏览器直接访问;超链接访问
其实servlet对象调用service中,首先检查请求类型(get/post等)然后调用相应的方法doPost或doGet,所以可以在servlet类中重写doPost或doGet来响应用户请求。
4 重定向和转发
两种:voidsendRedirect(String location)是HttpServletResponse类中的方法;
Public RequestDispatcher getRequestDispatcher(java.lang.String path)request对象可以调用,然后调用RequestDispatcher类中的forward(ServletRequestrequest,ServletResponse response)方法
使用第二种方法,可以获得request中的参数
5 使用session
servlet对象获取session对象:request调用HttpSessionsession=request.getSession(true);
练习1:计算用户输入的正整数的因子
访问页面
<%@page contentType="text/html; charset=GB2312" %> <HTML><BODY bgcolor=cyan><FONT size=3> <FORM action="getNumber" method="post"> 输入一个正整数:<INPUT type=text name="number" value=0> <BR><INPUT type="submit" value="提交" name="submit"> </FORM> </FONT></BODY></HTML>servlet类代码
package china.dalian; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Computer extends HttpServlet{ String servletName; public void init(ServletConfig config)throws ServletException{ super.init(config); servletName=getServletName(); } public void service(HttpServletRequest request, HttpServletResponse response) throws IOException{ response.setContentType("text/html;charset=GB2312"); PrintWriter out=response.getWriter(); out.println("<html><body>"); String str=request.getParameter("number"); out.print("我是一个servlet对象"+servletName+"。<BR>"); out.print("我负责计算"+str+"的因子:<BR>"); int n=0; try{ n=Integer.parseInt(str); for(int i=1;i<=n;i++){ if(n%i==0) out.println(" "+i); } } catch(NumberFormatException e){ out.print(" "+e); } out.println("</body></html>"); } }
<servlet> <servlet-name>computer</servlet-name> <servlet-class>china.dalian.Computer</servlet-class> </servlet> <servlet-mapping> <servlet-name>computer</servlet-name> <url-pattern>/getNumber</url-pattern> </servlet-mapping>