DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > 经验分享 > Java开发

Servlet和Jsp

servlet和CGI

我们知道Web服务器(如apache)只擅长提供静态页面,因此在动态应用场景,Web服务器会把请求转发给另一个能够动态处理的辅助应用(helper app),这个辅助应用就是CGI,而CGI可以用C、Python、PHP、Perl等等来实现。请求和应答如下图:

而Java的CGI实现就是Servlet,如下图:

由于servlet没有main()方法,因此它受控于web Container app(容器),而Tomcat就是一个这样的容器。Tomcat容器的作用提供通信支持、声明周期管理、多线程支持、声明方式实现安全、JSP支持等,看参考Tomcat初识。它的流程是这样的:

  1. Client发出一个请求到WebServer;
  2. WebServer接收到请求好转发给Web Container;
  3. Web Container根据URL在部署描述文件(web.xml)中找到对应的servlet;
  4. Web Container调用对相应的servlet的service()方法;
  5. servlet的service()方法根据请求的类型get/post调用相应的处理逻辑;
  6. 处理完毕后servlet返回结果;
servlet实例
  1. 构建项目

    我们使用Eclipse+Maven来构建Java的servlet应用,以前曾经写过一篇超入门级的:maven + eclipse + tomcat 实战JSP,文章里使用的maven构建再导入到eclipse中,当然你也可以从eclipse来使用maven插件来构建项目,我的测试项目如下:

    如果提示错误

    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    请参考这里解决:http://www.oseye.net/question/179

    默认的部署文件web.xml

    		
    1. <!DOCTYPE web-app PUBLIC
    2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4.  
    5. <web-app>
    6. <display-name>Archetype Created Web Application</display-name>
    7. </web-app>
  2. 运行

    建立完毕后我们可以通过Run As -> Run on Server就可以浏览index.jsp了(我用的Eclipse是Eclipse Java EE IDE for Web Developers.),显示“Hello World!”。

    添加Servlet:项目"mytest"右键->New->Other->Web->Servlet,ClassName填上“HelloOther”,Next会让设置URL路径,初始值等,再Next可以看到你需要的方法如doGet、doPost等,Finish后你会看到web.xml:

    		
    1. <!DOCTYPE web-app PUBLIC
    2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4.  
    5. <web-app>
    6. <display-name>Archetype Created Web Application</display-name>
    7. <servlet>
    8. <servlet-name>HelloOther</servlet-name>
    9. <display-name>HelloOther</display-name>
    10. <description></description>
    11. <servlet-class>net.oseye.web.HelloOther</servlet-class>
    12. </servlet>
    13. <servlet-mapping>
    14. <servlet-name>HelloOther</servlet-name>
    15. <url-pattern>/HelloOther</url-pattern>
    16. </servlet-mapping>
    17. </web-app>
    如上述原理,当Clinet请求”/HelloOther“时,Web Container会在部署描述文件web.xml中寻找servlet-name为的HelloOther的servlet配置,再找到处理这个请求的servlet类“net.oseye.web.HelloOther”。

    在net.oseye.web.HelloOthe类的doGet方法体中编码:

    		
    1. response.getWriter().println("Hello Other!");
    你访问”/HelloOther“就能看到结果了。
  3. 打包WAR    

    可以使用mvn命令创建WAR包:

    		
    1. mvn package
    也可以使用Eclipse的Export菜单来导出WAR包。

PS:这里我们只使用Tomcat,没看到使用Web Server呀?这是因为Tomcat本身就具有基本的HTTP服务器的功能,只是没有Apache等专业的Web Server健壮和完整。

简单的MVC

前面的示例我们在servlet中使用了

  1. response.getWriter().println("Hello Other!");
但如果是整个HTML页面将会非常麻烦,因此我们考虑使用MVC架构,servlet充当Controller角色,JSP充当View,Java Class充当Model,结构图如下:


通过Controller(servlet)从Model(DB)中获取数据,然后把数据包装成Servlet的请求属性,然后把请求(request和reponse)转发至Jsp(View),JSP生成一个HTML页面,并使用应答对象(response)返回至容器,示例图如下:

接着上面的示例代码,在net.oseye.web.HelloOthe类的doGet方法体中编码:

  1. request.setAttribute("word", "Hello Other!");
  2. RequestDispatcher view=request.getRequestDispatcher("HelloOther.jsp");
  3. view.forward(request, response);
HelloOther.jsp的代码如下:
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  2. pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <%=request.getAttribute("word")%>
  11. </body>
  12. </html>
这就实现了MVC结构,项目结构图如下:

后记

  1. ServletConfig和ServletConext
    Servlet的无参构造函数只是让Servlet变成一个对象,而init()方法让其成为一个Servleet对象,每个Servlet都有一个ServletConfig对象,用于访问部署配置文件信息,而且可以通过ServletConfig对象访问ServletContext。每个Web应用都有一个ServletContext对象,用来访问容器相关信息以及部署配置文件,其实ServletContext称为AppContext更合适一些。
    部署(DD)文件web.xml是这样的:
    		
    1. <!DOCTYPE web-app PUBLIC
    2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4.  
    5. <web-app>
    6. <display-name>Archetype Created Web Application</display-name>
    7. <context-param>
    8. <param-name>email</param-name>
    9. <param-value>kevin@oseye.net</param-value>
    10. </context-param>
    11.  
    12. <servlet>
    13. <servlet-name>HelloOther</servlet-name>
    14. <display-name>HelloOther</display-name>
    15. <description></description>
    16. <servlet-class>net.oseye.web.HelloOther</servlet-class>
    17. <init-param>
    18. <param-name>tel</param-name>
    19. <param-value>13910567832</param-value>
    20. </init-param>
    21. </servlet>
    22.  
    23. <servlet-mapping>
    24. <servlet-name>HelloOther</servlet-name>
    25. <url-pattern>/HelloOther</url-pattern>
    26. </servlet-mapping>
    27.  
    28. </web-app>
    可以在net.oseye.web.HelloOther的doGet中编码获取:
    		
    1. String tel=getServletConfig().getInitParameter("tel");
    2. String email=getServletContext().getInitParameter("email");
    3. response.getWriter().println("tel:"+tel+",email:"+email);
  2. 应答除了分派给JSP,还可以使用PrintWriter和ServletOutputStream,前者是字符,后者是流。获取方式:
    		
    1. PrintWriter pr=response.getWriter();
    2. ServletOutputStream os=response.getOutputStream();
  3. 请求和应答常用的方法
    		
    1. request.getParameter(arg0) //获取get/post参数值
    2. request.getHeader(arg0) //获取头信息
    3. request.getCookies() //获取cookies
    4. request.getSession() //获取session
    5. request.getRequestDispatcher(arg0) //分派请求
    6.  
    7. response.sendRedirect(String arg0) //重定向
    8. response.setHeader(String arg0, String arg1) //设置头信息,如果重复就替换
    9. response.addHeader(String arg0, String arg1) //添加头信息
    10. response.setContentType(arg0) //设置ContentType,避免手动拼写错误
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号