传智播客java培训日记-第4天
详细:
www.itcast.cn
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方法即可。