day05
一、servlet开发入门
1.Servlet:是一种开发动态WEB资源的技术
2.Servlet是一个接口,j2ee中提供了两个实现类GenericServlet和HttpServlet,我们新建Servlet一般都继承自HttpServlet
3.Servlet的方法:init()-WEB服务器创建Servlet时调用,service()-当有客户端请求时调用,destroy()-当Servlet被WEB服务器销毁前调用
getServletConfig()-获取Servlet的初始化参数信息,getServletInfo()-获取Servlet相关信息,如作者,版本...
4.如果我们想打包一个带包的java类 我们要用javac -d .(打包后存放在当前位置) xxx.java
5.path-指定的是java,javac的所在路径,class_path-java函数
类所在目录,方便编译的时候进行链接,java_home:指定jdk的安装路径,是支持java程序的运行环境目录
6.Servlet创建之后若想被浏览器访问,必须在web.xml中进行映射
<servlet>//配置一个Servlet
<servlet-name>ChatServlet</servlet-name>
<servlet-class>chat.ChatServlet</servlet-class>
</servlet>
<servlet-mapping>将Servlet映射出去
<servlet-name>ChatServlet</servlet-name>
<url-pattern>/servlet/ChatServlet</url-pattern>
</servlet-mapping>
二、Servlet生命周期
1.细节问题:在服务器运行过程中,每个Servlet最多会被创建一次,第一次请求Servlet则创建,若是第二次则用创建好的Servlet对象为其服务
2.对每次请求,WEB服务器都会创建新的HttpServletRequest和HttpServletResponse对象,并且调用Servlet的Service方法为其服务。
3.Servlet生命周期:第一次请求Servlet,服务器创建Servlet对象,并调用init()完成初始化,当客户端有请求时,调用Service()为其服务,WEB服务器
关闭的时候,Servlet被清楚,调用destroy()方法
三、使用Eclipse开发Servlet
1.新建WEB工程的时候,下部几个文件夹的含义:
a.src folder:java类的存放目录
b.webroot:开发环境中,WEB应用所在目录
c.Context ROOT:webroot的映射目录,也就是该WEB应用发布到服务器的时候的目录名称
2.当java编译器和JAVA虚拟机(JDK)版本不一致的时候,就会出现Bad version...
3.JDK的版本在Tomcat的配置中,JDK选项来配置,MyEclipse自带虚拟机
4.JDK7.0 javac指定编译器的版本 -7.0
四、HttpServlet和一些开发细节
1.HttpServlet在实现Servlet接口的时候,覆写了Service方法,在该方法内部会自动判断客户端的请求方式,根据方式的不同,转发到不同的处理方法
如doPost(),doGet()等
2.HttpServlet继承自GenericServlet
五、Servlet开发的一些重要细节
1.项目Context ROOT URl的修改方式:右键单击项目->properties->myeclipse->web即可看到相关的修改项
2.同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>的<servlet-name>的值可以相同,在映射的时候,可以实现伪静态,<url-pattern>可以使用通配符
但是只有两种格式:/*,*.后缀名
3.tomcat中conf/context.xml和web.xml中的配置会被所有的webapps共享
4.修改某个web应用的web.xml文件,不需要重新发布,这是因为conf/context.xml中有一个监视器,专门监视web.xml文件的修改
5.某个web应用的java类被修改后,一定要重新发布,发布后服务器会重新加载该webapp(无需重启)
6.Servlet引擎:调用Servlet的JAVA程序
7.如果在<servlet></servlet>节点中配置了<load-on-startup>1</load-on-startup>那么该servlet会在WEB服务器启动的时候就创建,并执行init方法。中间的1代表创建优先级,值
越大优先级越低
8.如果某个Servlet的<url-pattern/>是一个/,那么该Servlet就是该webapp的缺省Servlet,缺省Servlet处理其他Servlet都不处理的请求,tomcat服务器中就配置了一个缺省的servlet(会被共享),客户端的一切请求都是通过Servlet处理的,客户端请求一些html等静态资源,以及一些出错信息的输出,就是通过访问这个缺省Servlet来拿到资源的
六、Servlet的线程安全问题
1.Servlet是有线程安全问题的,如
public class ServletDemo extends Httpservlet{
int i = 0;
public void doPost(...,...){
}
public void doGet(...,...){
i++;
sysout(i);
}
}
2。Servlet的线程安全问题是不能通过synchronized(this)来解决的,这是因为当一个请求访问共享变量的时候,其他请求就必须等待,那么最后一个请求就会等待很长时间
3.创建类对象,首先把类的字节码文件加载进内存(不会随对象的摧毁而摧毁),首次加载的时候还会给静态变量分配空间,静态变量的生命周期和字节码一致。
4.解决Servlet线程安全问题的一种方法是,让Servlet实现SingleThreadModel接口,实现该接口后,Tomcat服务器会为每次请求都创建一个Servlet对象,因此不会有线程安全问题,但是已经不推荐使用
实际开发中还是使用加锁解决
5.标记接口:什么内容都没有的接口,仅起到一个标记作用,如SingleThreadModel,Serilizable...
6.子类覆盖父类的方法,不能抛出比父类更多的异常doGet(...,...)
七、ServletConfig对象
1.在Servlet的配置文件中,可以使用一个或多个<init-param>标签为其配置初始化参数,这些参数会被WEB服务器封装到ServletConfig对象中,在调用Servlet的init()方法时传给Servlet。
2.我们可以通过this.getServletConfig()来获取当前Servlet对象的ServletConfig对象,由而获取参数信息
3.一些适合写在Servlet配置文件中的参数:
a.字符编码集
b.数据库连接信息
c.要获取的配置文件