Servlet讲义笔记

 

Web Application 互联网应用


1. Programming编程: XXX.java -> XXX.class

2. Deploymen部署:   xxx.xml(web.xml)
       WEB 应用在Tomcat服务器里的路径

 

================================================
Tomcat 安装  http://tomcat.apache.org
================================================
1.exe可执行文件,直接安装
2.zip 解压缩
注意:安装文件还有包含admin的和没有的,没有的从官方下载admin部分 然后安装或解压缩
安装后,访问http://localhost:8080  出现tomcat界面 就表示安装成功


安装后的配置

1.用户配置
 配置文件:\conf\tomcat-users.xml
 角色配置:如果没有添加如下配置
  <role rolename="manager"/>
    <role rolename="admin"/>
 用户:<user username="admin" password="admin" roles="admin,manager"/>

2.端口号可以修改
 配置文件:\conf\server.xml
 <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />

3.修改server.xml
 <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
 在配置中添加URIEncoding="UTF-8"
 
    修改目的:为了解决使用HTTP Get方法传递中文参数乱码的问题

4.修改 context.xml
 
 把<context>修改成<context reloadable="true">

     修改目的:当web应用中的文件或web.xml文件修改后,tomcat服务器会自动重新加载当前web应用,
  避免重新启动tomcat。
     注意: 这个修改会对tomcat的运行性能有影响,开发阶段设为true便于我们开发,而运行使用阶段
     最好修改为false

---------------------------------------------------------------------------------------

Module 1:Servlets Basics

1. CGI:   common gateway interface  通用网关接口 
 该技术就是为了解决动态交互。程序来实现数据在Web上的传输,使用的是如Perl这样的语言编写的

 缺点:基于进程,它对于客户端作出的每个请求,必须创建CGI程序的一个新实例新进程,
  这样占用大量的内存资源。由此才引入了Servlet技术。

   Servlet:Sun公司1997年推出了CGI的Java版本技术Servlet。Servlet是一个用java编写的应用程序,在服务器上运行,处理请求信息并将其发送到客户端。对于客户端的请求,只需要创
建Servlet的实例一次,因此节省了大量的内存资源。Servlet在初始化后就保留在内存中,因此每次作出请求时无需加载。

2. HTTP: request   method -> get, post, delete

3. staic HTML 静态HTML:   xxx.HTML,  xxxxx.htm 
   dynamic HTML 动态HTML :  produced by program (CGI script, servlet/jsp, etc.)

4. Servlet: run on server(JRE-VM)

   Applet: run on client(JRE-VM)


    Servlet (interface)
      |   
      |     public ServletConfig getServletConfig()
      |     public java.lang.String getServletInfo()
      |
      |     public void init(ServletConfig config) throws ServletException
      |     public void service(ServletRequest req, ServletResponse res)
      |                             throws ServletException, java.io.IOException
      |     public void destroy()
      |
    GenericServlet (abstract class)
      |
      |
  * HTTPServlet (abstract class)         

          * public void doGet(HttpServletRequest req, HttpServletResponse res){ }

          * public void doPost(HttpServletRequest req, HttpServletResponse res ){ }
   
  
  * HttpServletRequest:   interface

  * HttpServletResponse:   interface

      *  public void setContentType(java.lang.String type)
          Example:  setContentType("text/html");  // char stream  :  text/xml
                    setContentType("image/gif");  //byte stream   :  image/jpeg

      *  public java.io.PrintWriter getWriter() throws java.io.IOException
          Example:  PrintWriter out = res.getWriter();
                    out.println(string); // send to client
 
      *  public ServletOutputStream getOutputStream() throws java.io.IOException
          Example:  ServletOutputStream out = res.getOutputStream();
                    out.write(?);

===============================================================================================
实现一个Web Application所需的基本内容

1.  写一个类扩展HttpServlet,重写doGet和doPost方法
2.  生成web.xml配置文件
==============================================================================================

<1>如何写一个Servlet

   //扩展HttpServlet类
  public class XXXXXServlet extends HttpServlet{ 

      //override复写doGet方法
      public void doGet(HttpServletRequest req, HttpServletResponse res){  // 被service方法调用
                //parse request       处理请求

                // do something       完成要做的事

                // send reponse  !!!! 返回响应
      }

      //或复写doPost方法
      public void doPost(HttpServletRequest req, HttpServletResponse res){ //被service方法调用
                // parse request            处理请求

                //  do something            完成要做的事 

                // send reponse  !!!!       返回响应
      }
  }

<2>web.xml中的配置:servlet和servlet-mapping
     <servlet>
     <servlet-name>HelloWorldServlet</servlet-name>
     <servlet-class>servletFirstTest.HelloWorldServlet</servlet-class>
     </servlet>

    <servlet-mapping>
     <servlet-name>HelloWorldServlet</servlet-name>
     <url-pattern>/servlet/HelloWorldServlet</url-pattern>
    </servlet-mapping>

例如:  
   http://localhost:8080/servletTest/servlet/HelloWorld
         /servlet/HelloWorld  是 url-pattern


    服务器从web.xml查找: url-pattern  -> servlet-name -> servlet-class
----------------------------------------------------------------------------------------------
  
  Servlet life cycle生命周期:

----------------------------------------------------------------------------------------------
    new instance 
    init(?)          -> be called only once
  
    service(?,?)     -> be called many times, by different thread(client)
   
    destroy()        -> be called only once
  
  
    public void service(HttpServletRequest req, HttpServletResponse res) {   // in HttpServlet
 
        ...
        if(request method is get)
            doGet(req, res);
        else if(request method is post)
            doPost(req, res);
       else if(request method is delete)
            doDelete(req, res);
       else ...

    }

 

servlet生命周期

servlet 运行在servlet 容器中,其生命周期由容器来管理。servlet 的生命周期通过 javax.servlet.Servlet接口中的init(),servce(),和destory();方法表示。

1,加载和实例化

servlet 容器负责加载和实例化servlet 当容器启动或在容器中检测到需要这个servlet来响应一个请求 时。创建servlet实例。容器通过java 的反射API来创建servlet实例.所以servlet中不应该提供带参数的构造函数。

2,初始化

在servlet实例化后,容器必须调用 init() 方法来初始化这个对象。初始化的目的是为了让servlet对象在处理客户请求之前完成一些初始工作。对于每一个servlet实例,init() 方法只会调用一次。

3,请求处理

servlet 容器调用service()方法对请求处理。servlet 实例通过ServletRequest对象获得客户端的相关信息和请求信息。在对请求处理后调用ServletResponse对象设置响应信息。

4,服务终止

当容器检测到一个servlet实例应该从服务器中移除时,容器调用实例的destory方法。让实例释放它所占用的资源。如果在次发请求就会 创建一个新的servlet 实例。

      在整个servlet 的生命周期中,创建servlet实例,调用实例的init()和destory()方法都只执行一次,当初始话完成后,servlet容器将该实例保存在内存中,通过servlce()  方法为接受请求服务。

-----------------------------------------------------------------------------------------------
WEB 应用在Tomcat服务器里的路径

->Tomcat5.0
   -> webapps
         ->yourWebApplicationName
                ->WEB-INF
                       ->web.xml

                       ->classes
                              -> packageName
                                          -> XXX.class

                       ->lib
                              -> xxxx.jar

               ->xxx.html
               ->xxx.jsp
               ->xxxx.jpeg
               -> myDir
                     -> xxxxx.html
                     -> xxxxx.jsp

-------------------------------------------------------------------------------
web.xml配置文件    url-pattern  ->  servlet-name  -> servletclass

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>sample.HelloWorld</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>DateTest</servlet-name>
    <servlet-class>sample.DateTest</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ImageTest</servlet-name>
    <servlet-class>sample.ImageTest</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/servlet/HelloWorld</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DateTest</servlet-name>
    <url-pattern>/servlet/DateTest</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ImageTest</servlet-name>
    <url-pattern>/servlet/ImageTest</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

------------------------------------------------------------------------------
在浏览器输入:

  http://localhost:8080/servletTest/servlet/HelloWorld
         /servlet/HelloWorld  是 url-pattern


    服务器从web.xml查找: url-pattern  -> servlet-name -> servlet-class

------------------------------------------------------------------------------
Assignment

1. install Tomcat5.0:  jakarta-tomcat-5.0.28.exe
2. install MyEclipse 5.5:  MyEclipse_5.5GA_E3.2.2_FullStackInstaller.exe
3. write your servlet program
4. deploy your web application
5. run


******************************************************************************
******************************************************************************
                                       总   结:
******************************************************************************
******************************************************************************
==============================================================================
开发Web应用(Servlet)步骤
==============================================================================
1.安装tomcat,浏览器中http://localhost:8080可以访问到tomcat页面
2.正确安装好开发环境Myeclipse插件
3.在IDE中配置好Server服务器Tomcat,能够正确部署和启动web项目
4.开发web工程
 -->创建web工程
 -->编写web(Servlet)程序
5.部署deploy 工程
6.启动服务器tomcat
7.浏览器中访问工程 http://localhost:8080/工程名/url-pattern


===============================================================================================
实现一个Web Application所需的基本内容

1.  写一个类扩展HttpServlet,重写doGet和doPost方法
2.  生成web.xml配置文件
==============================================================================================

<1>如何写一个Servlet

   //扩展HttpServlet类
  public class XXXXXServlet extends HttpServlet{ 

      //override复写doGet方法
      public void doGet(HttpServletRequest req, HttpServletResponse res){  // 被service方法调用
                //parse request       处理请求

                // do something       完成要做的事

                // send reponse  !!!! 返回响应
      }

      //或复写doPost方法
      public void doPost(HttpServletRequest req, HttpServletResponse res){ //被service方法调用
                // parse request            处理请求

                //  do something            完成要做的事 

                // send reponse  !!!!       返回响应
      }
  }

<2>web.xml中的配置:servlet和servlet-mapping
 <servlet>
     <servlet-name>HelloWorldServlet</servlet-name>
     <servlet-class>servletFirstTest.HelloWorldServlet</servlet-class>
    </servlet>

    <servlet-mapping>
     <servlet-name>HelloWorldServlet</servlet-name>
     <url-pattern>/servlet/HelloWorldServlet</url-pattern>
    </servlet-mapping>

例如:  
   http://localhost:8080/servletTest/servlet/HelloWorld
         /servlet/HelloWorld  是 url-pattern


    服务器从web.xml查找: url-pattern  -> servlet-name -> servlet-class
========================================================================================

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常考面试题 1.讲下servlet的执行流程。 Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()《启动顺序根据web.xml里的startup-on-load来确定加载顺序》 方法初始化servlet,再根据不同请求调用doGet或doPost方法,最后再通过destroy()方法进行销毁。 2.Get和Post的区别 在页面提交数据时,get的数据大小有限制4k,post没有限制,get请求提交的数据会在地址栏显示,post不显示,所以post比get安全. 3.有三台服务器,如果在一台服务器上登陆了这个用户,其他两台就不能再登陆这个用户,使用session共享,你是怎么做的。 把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session数据。 4.写一个自定义标签要继承什么类 SimpleTagSupport,一般调用doTag方法 或者实现SimpleTag接口 5.Jsp如何处理json 在 jsp 中处理 JSON,通常需要配套使用 JQuery 控件,并且导入一些 Common jar 包。 使用 JQuery 控件是因为它能有效的解析并且展示 JSON 数据, 导入Common 则是因为 Java 中的对象并不是纯粹的数据,需要通过这些 Jar 包的处理使之转化成真实数据。 6.如何处理Servlet的线程不安全问题 1.最简单的就是不使用字段变量, 2.使用final修饰变量, 3.线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全, 所以可以在Servlet的线程里面加上同步方法或同步块。 (Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能变差,最好不去使用实例变量) 7.Jsp的重定向和转发的流程有什么区别 重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发 重定向会导致request对象信息丢失。转发则不会 转发的url不会变,request.getRequestDispatch().forward() 重定向的url会改变,response.getRedirect().sendRedirect();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值