首页 > 代码库 > Servlet
Servlet
一】Servlet入门
1)是SUN公司基于Java技术的一个开发动态资源支持的规范,以
2)Servlet是一种特殊的Java类,运行时服务端/容器中,接收每一个客户端的请求并响应,遵循HTTP协议
3)Servlet手工开发过程,参见<<手工创建Servlet的全过程.txt>>
配置环境变量set classpath=%classpath%;
配置servlet如何被外界访问
<servlet>
<servlet-name>MyServlet</servlet-name>//Servlet的名字
<servlet-class>cn.itcast.web.servlet.MyServlet</serblet-class>//Servlet全路径
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name> //servlet名字,必须和上述一致
<url-pattern>/my</url-pattern>//以/开头,提供外界用户访问的路径
</servlet-mapping>
二】开发Servlet的三种方式
1)实现Servlet接口
2)继承并扩展GanericServlet类
3)继承并扩展HttpServlet类,注意:此类只适合Http协议的类型。
1》如果浏览器以get方式提交,复写doGet()方法
2》如果浏览器以post方式提交,复写doPost()方法
补充:
1》web.xml配置:
<servlet>
<servlet-name>Dem11[servlet名字,可以任意]</servlet-name>
<servlet-class>cn.itcast.web.servlet.Demo11[servlet全路径名]</srevlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo11[servlet名字,必须和上述一致]</servlet-name>
<url-pattern>/qq[以/开头,提供外界用户访问的路径]</url-pattern>
</servlet-mapping>
2》如果需要输出中文,需要在Servlet中做如下设置:
//服务端通知浏览器以指定的编码方式来显示中文
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("欢迎学习JavaServlet程序!");
方法原型:
void setContentType(String type);
三】Servlet调用的详细步骤
1》当浏览器第一次访问Servlet时,服务器首先会解析web.xml文件,根据浏览器访问的路径,解析出该Servlet的全路径
2》找到Servlet后进行反射(Class.forName().newInstance),创建一个Servlet对象(此时会调用构造方法)
3》调用init()方法:Servlet作初始化工作
3》调用doXxxx()方法:为浏览器响应
4》如果浏览器再次访问相同的Servlet,只需从服务端维护的Servlet实例结合中取得对象的实现,来进行相应的动作
5》当服务器决定销毁Servlet实例之前(如重新部署工程时),调用此Servlet实例的destroy()方法,销毁此对象。
注意:
1》每创建一个Servlet实例后,会自动放入服务端的Servlet实例池(容器)当中存储,备用。
2》同一个Servlet实例,在服务端只有一个。
3》每个实例只会调用一次的方法:构造方法、init()方法,Destroy()方法
输出结果:
Demo2()--hashCode://构造函数,在反射阶段调用
init()--hashCode:
doGet()--hashCode:
doGet()--hashCode:
doGet()--hashCode:
doGet()--hashCode:
四】Servlet细节
1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头
2)一个Servlet的url-pattern可以是1个或者多个
3)url-pattern只能有两种格式,但只能使用其中一种:
1》*.后缀名(后缀名是任意的)
2》/*
即:/和*不能同时使用 */
4)多种url-pattern的优先级:
1》不同方式:/*优先级大于*.后缀名 */
2》同种方式:最相似的为准。
5)程序员编写的Servlet其实是由tomcat容器中Servlet引擎来处理的,引擎会产生
对应的HttpServletRequest、HttpServletResponse等对应传入到Servlet的doXxxx()等方法中
6)允许在用户第一次方法之前就做一些初始化工作:
通过在web.xml中配置代码,让Servlet在部署时就创建。
即,加上:<load-on-startup>n</load-on-startup>//n为正整数,或者0,不能为负数
n越小,部署的时候,先加载。
eg:
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.Demo1</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
7)url-pattern为/的servlet是一个缺省的servlet,专用于处理当前web应用下,访问路径错误的请求。
所以,只需要修改web.xml就可以设置一个缺省的servlet了。
且,任何web服务器都有一个缺省的servlet来处理。
eg:
<servlet-mapping>
<servlet-name>Demo3</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
补充:当访问Tomcat服务器中的某个静态HTML文件和图片时,实际是在访问这个缺省的Servlet,
只是此缺省的Servlet里面带有转向到静态HTML的功能而已。
8)每个线程会共享同一个Servlet的实例变量,所以要对临界资源进行加锁的操作。
产生线程安全问题的条件(缺一不可):
1》单例
2》实例变量
3》实例变量进行修改操作
解决办法:
1》通过加锁的方式,对敏感数据块进行代码的同步。
2》过时的方式:实现类SingleThreadModel(实际运行会出错。)
Servlet