我的java培训日记-4

                                          传智播客java培训日记-4
1. Servlet 程序详细讲解
       Servlet class 文件必须放在 WEB-INF/classes 文件夹下
       ② 对每个单独的WEB程序的Servlet容器进行讲解。写了一个servlet实例
③用显示火车票剩余数量的例子引入产生动态网页内容的讲解,服务器送给浏览器的内容不一定非得是来自一个网页文件,而可以是程序动态创建出来的,Servlet就是这样一种程序。
④查看Servlet的使用帮助,在<Tomcat安装目录>/webapps/tomcat-docs/servletapi
⑤配置 web.xml文件的servlet元素,主要有servlet-name和servlet-class
     其中name可随意,指定servlet-class是WEB程序中WEB-INF/classes文件夹中的要加载的 .class 文件
                   配置 web.xml文件的servlet-mapping元素,主要有servlet-name和url-pattern
其中name必须与servlet的name相同,url-pattern为要映射的虚拟路径,可以是在硬盘上并不存在的文件(夹)
⑦  同一个servlet类可以在web.xml中映射成为多个名称不同的servlet容器
⑧讲解了Servlet程序的作用,在讲解Servlet接口中的方法时,顺便说明了ServletContext和ServletConfig是什么,接着分析如何写Servlet时带出了GenericServlet类的大概代码原理。
伪代码:
class xxx implements Servlet
{
       private ServletConfig config = null;
       init(ServletConfig config)
       {
              this.config = config;
       }
      
       service(ServletRequest request,ServletResponse response)
       {
              config.getServletContext();
       }
      
       ServletConfig getServletConfig()
       {
              return config;
       }
      
       destroy
       {
       }
      
       getServletInfo()
       {
              reutrn "i am "
       }
}
Java虚拟机的类装载器的加载根目录为<JAVA安装目录>/jdk1.6/jre/lib/ext
讲了Tomcat与Java虚拟机的类加载机制,大致为当运行的代码需要装载某个类时,上下文类装载器会委托它的父级类装载器来装载这个类,如果父级类装载器无法装载这个类时,上下文装载器才自己进行装载,如果它自身仍不能装载,就会产生错误,如下图… 类的加载需要正确的 classpath 设置

             

Bootstrap
 
System
Common
Catalina
Shared
Webapp1
Webapp2
当WEB程序需要用到某个类时,类加载器先向上委托加载,,如果不能处理,就向下返回由它自己加载
                      

2. 时刻想着线程安全问题,只要是多段函数访问同一个方法,多个对象的变量引用同一个目录,都有可能会出现线程安全问题
3. 模板方法设计模式的一些思想
架构师将类的框架设计好后,将某部分不确定代码做成一个抽象方法,然后交由其它程序员继承这个类,并实现这个抽象方法.
Class abstract BaseServlet
{
service() throws IOException,ServletException
{
    try
    {
           doService()
    }
    catch(SqlException e)
    {
           throw new IOException(e);
    }
}
    public abstract void doSevice();
}
YourServlet extends BaseServlet
{
    public doService()
    {
           ....
    }
}
4 class 编译文件自动保存目录的方法
使用命令 Javac –d class文件的保存目录 XX.java
可写个批处理文件,例 a.bat,直接将JAVA源文件托至些BAT文件即可
javac –d d:/ %1
pause
5. 鲍习涛的问题
为什么加了System.out.println()后,前面用write方法写入的内容才会显示在屏幕上?
这是因为System.out是PrintStream类,PrintStream是个带缓冲的包装类,println()会自动调用System.out.flush()方法。
6. 写了一个获取ip地址和请求参数的Servlet例子程序,并注册运行。接着分析了Servlet的工作原理,以及Request和Response是接口的设计原理,很好地说明了“ 面向接口编程,而不要面向类编程”的思想
       例:MyWebServlet.java    我自己写的
       import javax.servlet.*;
import java.io.*;
public class MyWebServlet extends GenericServlet
{
                public void service(ServletRequest  req,ServletResponse  response) throws ServletException,IOException
            {
                 String ip = req.getRemoteHost();
                 response.getWriter().println("Your ip issss:"+ ip);
            }
}
7. 在上面的例子基础上进行扩展,讲解了Servlet的映射问题,接着演示了ServletContext和ServletConfig的应用,通过ServletConfig获得Servlet的注册名称和配置参数,通过ServletContext获得Web服务器程序的名称getServerInfo方法。Servlet运行于Web应用程序中,而每一个WEB应用程序对应一个Context元素,所以,就把Servlet运行的Web应用程序称之为ServletContext,这从名字上就可以知道其作用。一个虚拟目录就是一个Web应用程序,把某个目录单独挂到服务器上,这个目录就成了一个独立的Web应用程序,这个目录下的子目录不是独立的web应用程序。
8. 接着把Servlet注册两次,每个映射给不同的url,一个是/action/*,一个是*.html,借此说明了映射的优先级问题。
9. 接着引出了tomcat的DefaultServlet,别人都不要的请求交给它。
       关于第七和第八点的例子,张老师写的。
import javax.servlet.*;
import java.io.*;
import java.util.*;
import javax.servlet.http.*;
public class MyServlet extends HttpServlet
{
       /*Enumeration getInitParameterNames()
       {
              return getServletConfig().getInitParameterNames();
       }*/
       public init(ServletConfig conf)
       {
              super.init(conf);
              init();
       }
       public init()
       {
       }
     public void doGet(HttpServletRequest req,HttpServletResponse response) throws ServletException,IOException
       {
              PrintWriter out = response.getWriter();
              ServletConfig config = getServletConfig();
              Enumeration e = /*config.*/getInitParameterNames();
              while(e.hasMoreElements())
              {
                            String name = (String)e.nextElement();
                            String value = /*config.*/getInitParameter(name);
                            out.println(name + ":" + value + "<br>");
              }
              HttpServletRequest request = (HttpServletRequest)req;
              Enumeration e2 = /*config.*/request.getHeaderNames();
              while(e2.hasMoreElements())
              {
                            String name = (String)e2.nextElement();
                            String value = /*config.*/request.getHeader(name);
                            out.println(name + ":" + value + "<br>");
              }
              String ip = req.getRemoteAddr();
              String time = new Date().toString();
              out.println(ip + ": " + time);
              out.println(req.getParameter("userid") + ": " + req.getParameter("bookid"));
              response.getWriter().println(getServletConfig().getInitParameter("corporation"));
              response.getWriter().println(getServletConfig().getServletName());
              response.getWriter().println(this.getClass().getClassLoader().getClass().getName());
              response.getWriter().println(getServletConfig().getServletContext().getServerInfo() );
}
}
10. 接着讲解了类装载器
通过对比Student类的实例对象是各个学生,强调了Class类的实例对象是各个类字节码。
Class clazz1 = Class.forName("Abc")
Class clazz2 = Class.forName("Student")
Student st = clazz2.newInstance();
一个类装载器负责从特定的位置加载和创建类字节码,应用程序中安装有多个类装载器,应用程序会尝试依次使用各个类装载器去加载某个名称的类,这个尝试使用的规则就是委托代理机制。
11. 要让多个应用程序都能装载某个Servlet,把Servlet放在哪里?
应把Servlet放在<tomcat安装目录>/common/lib中,要做成jar包放在这个文件夹中.classes文件夹放置零散的class文件。
12. 按书做了类装载器的实验,不过是把Servlet类放置到了<java安装目录>/jre/lib/ext目录中,一定要打成jar包。
13. 讲解了Servlet程序的作用,在讲解Servlet接口中的方法时,顺便说明了ServletContext和ServletConfig是什么,接着分析如何写Servlet时带出了GenericServlet类的大概代码原理。
14. 讲解了HttpServlet类
HttpServlet是GenericServlet的子类,SUN公司在HttpServlet中重写了service方法,并在这个方法中调用了另一个service方法(两个service接受的参数类型不同),,所以我们只需要根据自己的需要重写service2方法即可。
 
详细: www.itcast.cn 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值