zoukankan      html  css  js  c++  java
  • Java EE学习笔记(1:Servlet & JSP)

    Servlet简介

    Servlet技术规范是JavaEE技术规范中的一个重要组成部分,Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面(实际上,Servlet不仅仅是用于返回HTML的页面的,比如,Servlet还可以返回Xml,JSON等格式的字符串,当然了,也可以返回视频流,等等)。
    Servlet要运行于Servlet容器上,目前,IBM的WebSphere,BEA的WebLogic,Apache的tomcat,SUN的GlassFish,这些JavaEE的服务器,都含有Servlet容器,我想这么说,Servlet的容器和JavaEE的服务器之间的关系就区别开了吧? 其中以tomcat为例,它是一个著名的开源的JavaEE服务器,它包含有一个Servlet容器,(但是并不包含EJB的容器),也就是说,tomcat是一个不能完整支持JavaEE技术规范的容器(不支持EJB),但是这对构建一个Web Site是够用了。如果想使用tomcat,并使用EJB,通常是采用JBoss作为服务器的,因为JBoss本身是一个EJB的容器,并且把tomcat集成进来,来完成Servlet容器的角色。tomcat除了要提供Servlet容器外,显然还要承担起HTTP Server的角色,但是也有人用Apache服务器+Tomcat的Servlet容器,来构成一个完整的服务器,也就是说,不使用tomcat所提供HTTP服务,而是用Apache的。
    Sun的GlassFish,是一个比较完整支持JavaEE规范的Server。刚才看到了一条新闻,Oracle完成收购SUN后,依然会支持GlassFish。原文如下:

    (GlassFish
    甲骨文表示将会调整Oracle WebLogic server和GlassFish的投资组合,他们计划继续让GlassFish Enterprise Server作为遵循Java EE规范的开源RI。同时,甲骨文表示也会继续支持GlassFish社区。
    编者注:除了以上开发者们关注的两个产品之外(是的,还有Java FX。对于Java,Oracle自从收购开始之日就一直态度明确;然而Java FX,在这份FAQ中仍然没有提及),下面还提到了Sun的虚拟化产品和Open Office的处理策略。)

    我觉得Servlet技术,和CGI技术有着相当的相似度。如果把Servlet放到传统的CGI程序,和当下的JSPJSF,ASP.net中间,我觉得它更加地接近前者,没有一个本质的跃迁

    详解servlet实例

    上面这个链接,写得不错,OK:
    假设我写了一个HelloServlet,它返回一个欢迎页面。
    HelloServlet是如何被创建的呢? 首先可以肯定的说,不是new出来的,容器根本不知道我们会写出叫什么名字的Servlet classes。这就像MFC,谁知道我们的Document class叫什么名字,于是动态创建就有用武之地了。当然了,在Java里面,反射是更加强大的武器。(而且记住,容器不会new HelloServlet,而就是我们企图调用这个Servlet,也不要new!)
    服务器会侦听某一个端口,比如说8080,现在浏览器要访问我们的Server了,http://127.0.0.1:8080/hello
    OK,Server会accept浏览器的链接,当然了,这是个TCP层的问题,而在HTTP层面上,我们会看到Request的HTTP请求信息,里面就含有URL,于是我们自然就得到了hello这个字符串。这个时候,HTTP Server就要把处理逻辑转到Servlet容器上了。
    根据JavaEE的规范,Servlet容器会读一个web.xml。里面大致有这样的配置内容:

    <servlet>
            <servlet-name>Hello</servlet-name>
            <servlet-class>org.bizcuit.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>Hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>

    注意那关键的四行,其中servlet-name是Hello,成为上面和下面两个部分的桥梁,上面的部分说明了调用这个名字的Servlet,会实例化哪个Java class。而下面的部分则说明了,URL的pattern如果是/hello,那么就会调用名为Hello的Servlet。其中,还要注意url-pattern项,这里可是有些名目的。
    OK,这样,Servlet容器就知道要加载哪个Servlet的class了,那么这个加载是通过反射来完成的。

    Class cls = Class.forName(servletClassName);
    Object servlet = cls.newInstance(); 

    当然了,这个比伪码还简单了,因为一个Servlet class,通常只在容器内产生一个实例(也有办法生成多个实例,但是可能会产生效率的问题,后面讲),因此,要注意线程安全的问题(后面讲)。
    但是现在,我们有了Servlet的实例了,于是,我们可以调用它的方法了,根据Servlet规范,容器根据浏览器的请求(GET/POST/...),会调用service,或者是doGet,doPost方法。以doGet方法为例:

    public class HelloServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws IOException {
            resp.setContentType("text/html");
            resp.getWriter().println("<div>Hello</div>");
        }
    }

    注意doGet方法的两个参数,很重要,这里就不赘述了,还是要在具体的实践中掌握的。
    关于Session,可以通过这个方法得到。req.getSession();

     

     


    JSP简介
    我个人认为JSP是一种比PHP更加灵活,强大的服务器端脚本,无奈PHP确实简单很多啊。

    JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP,PHP等技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。
    运行JSP,也是需要Servlet容器的,原因就是JSP在第一次被访问的时候,会被翻译为一个Servlet,当然了,这个Servlet最终也是要被编译为.class文件的,所以,JSP是在Servlet的技术上构建出来的,而且JSP的运行速度很快,毕竟是被编译成字节码在运行,相比传统的ASP脚本的解释方式,快了许多。
    关于JSP,还有JSP的tag可以作为单独的课题来研究一下。

    <JSP试验部分>

    1. DOWNLOAD tomcat first:  tomcat 6.x zip format
        下载后,解压缩。
    2. 启动tomcat
        找到目录$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\bin,Windows上,双击startup.bat即可。
        http://localhost:8080/
        好歹试一试tomcat是不是真的起来了。GO~
    3. 创建一个JSP文件。
        目录,$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\webapps\ROOT
        创建一个文件,hello.jsp。里面输入下列内容。

    <%@page language="java" %>
    <%@page import="java.util.*" %>
    <html>
    <head>
    <title>Hello World!</title>
    </head>
    <body bgcolor="#FFFFFF">
    <%
    String msg= new Date().toString();
    out.println("Hello World!<br>");
    %>
    <div style="color:red">
    <%=msg%>
    </div>
    </body>
    </html>

     保存,然后启动服务器(当然了,服务器起来后,再创建、修改JSP也可以,不需要重启服务器。),试一试,http://127.0.0.1:8080/hello.jsp
    4. 随便再改改,体验一下JSP,<%%>内,可以接受Java code(当然了,不是全部)。

    <Servlet试验部分>
    写简单的JSP,我觉得不用IDE也OK,但是Servlet,我们还是借助IDE吧,大段的Java代码,我喜欢用Eclipse。
    1. 下载eclipse-jee-galileo-SR1-win32,Click here to download

    2. 启动Eclipse。注意,Eclipse一定要指定一个workspace才行的。

    3. 从菜单里面找File->New->Project,选择后弹出一个可以创建工程的对话框。在里面找到Web |_ Dynamic Web Project。
        不负责任的说,自己一路Next下去吧。应该没有什么问题。工程的名字可以选择为Hello。

    4. 再创建一个服务器。
        
        不负责任的说,找到对话框,自己一路Next下去吧。应该没有什么问题。

    5. 这样就差不多了,可以写代码了,也可以调试了。具体的问题应该不难解决。在Hello工程里面创建一个Servlet。
        在左侧的Package Explorer中,展开Hello,在src目录那里,右键,准备创建一个Servlet,找到对话框,

         
        在Class Name那里写HelloServlet即可,Java Package那里写org.bizcuit。其他的不用修改。OK,这样,IDE就帮我们创建好一个Servlet的java文件了。
        在doGet方法内,可以试着写入这样的code:
        

    PrintWriter pw = response.getWriter();
    pw.print(
    "<html><body><div style='color:red'>Hello</div></body></html>");

        当然了,Servlet里面返回HTML往往属于比较土的做法,因为还不如写JSP呢(当然了,Servlet返回HTML也可能有更好的理由。)
    6. 开始调试了。
        在Project Hello上右键,找到Debug As菜单项,选择Debug on server。
        选择一个已有的Server这一项(Choose an exsiting server.)。因为我们已经建立过一个Server tomcat了。
        然后一路Next到Finish~。试一下 http://127.0.0.1:8080/Hello/HelloServlet
        URL中,第一个Hello是由于你创建的工程名是Hello,接下来HelloServlet,是你的servlet class的名字。

    7. 试一下改写你的Servlet,是不需要重启服务器的。

     

  • 相关阅读:
    cpu 怎么区分指令与数据,寄存器与内存各自对应什么
    添加省略号
    有关自有属性,原型属性的问题
    实现一个new
    滚动条样式修改
    备忘录实现+具体需求应用备忘录
    Math.random生成指定范围的随机数
    reduce详细用法
    一个搜索上下的功能,用的不多
    svg拖拽rect,line,circle
  • 原文地址:https://www.cnblogs.com/akira90/p/2755904.html
Copyright © 2011-2022 走看看