servlet访问流程
-
Servlet的访问过程
1.客户端通过发送请求给Tomcat,Tomcat发送客户端的请求页面给客户端。
2.用户对请求页面进行相关操作后将页面提交给Tomcat,Tomcat将其封装成一个HttpRequest对象,然后对请求进行处理,。
3.Tomcat截获请求,根据action属性值查询xml文件中对应的servlet-name,再根据servlet-name查询到对应的java类(如果是第一次,Tomcat则会将servlet编译成java类文件,所以如果servlet有很多的话第一次运行的时候程序会比较慢)。
4.Tomcat实例化查询到的java类,注意该类只实例化一次。
5.调用java类对象的service()方法(如果不对service()方法进行重写则根据提交的方式来决定执行doPost()方法还是doGet()方法)。
6.通过request对象取得客户端传过来的数据,对数据进行处理后通过response对象将处理结果写回客户端。
-
Servlet的线程安全问题
- 当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet,
- 当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。
- JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的,这种默认以多线程方式执行的设计可大大降低对系统的资源需求,提高系统的并发量及响应时间。
- Servlet本身是无状态的,一个无状态的Servlet是绝对线程安全的,无状态对象设计也是解决线程安全问题的一种有效手段。
-
解决方案
避免使用实例变量(即非static 的成员变量 )
避免使用非线程安全的集合
在多个Servlet中对某个外部对象(例如文件)的修改是务必加锁(Synchronized,或者ReentrantLock),互斥访问。
属性的线程安全:ServletContext、HttpSession是线程安全的;ServletRequest是非线程安全的。
=======================================================================================
-
修改Servlet模板
-
先找到MyEclipse的安装路径
C:\Users\forever\MyEclipse 2015\plugins\com.genuitec.eclipse.wizards.xxxx.jar
-
我自己的:com.genuitec.eclipse.wizards_13.0.0.me201502130035.jar
-
千万别解压,右键–选择压缩工具打开–templates–Servlet.java修改内容
- 拖回去之前,先MyEclipse关闭。
-
-
ServletConfig对象
-
ServletConfig对象和配置文件相关
-
配置初始化参数
-
需要在标签下配置。
- 如果要是配置在某个servlet的标签下,那么只能在该servlet中获取初始化参数。
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
- String getServletName() 获取配置文件中servlet的名称
- String getInitParameter(String name) 获取初始化参数
- Enumeration getInitParameterNames() 获取初始化参数的名称们
-
-
-
该对象位于servlet对象的init()方法的参数中,用于获取初始化参数。
@Override
publicvoid init(ServletConfig config)throwsServletException{
// TODO Auto-generated method stub
}
- 也可以直接通过getServletConfig() 方法获取该对象
-
======================================================================================
-
ServletContext对象(域对象)(很重要的域对象)
-
定义:WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
-
一个WEB应用对应一个ServletContext对象
一个WEB应用下有多个Servlet程序
所有的servlet程序都共享同一个ServletContext对象demo1存入内容 ServletContext demo2中取出来
-
获取WEB应用全局初始化参数
- 在web.xml中配置
<context-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</context-param>
在servlet中通过如下代码获取配置的参数
String getInitParameter(String name);
getInitParameterNames();
- 在web.xml中配置
-
实现数据的共享(*****)
void setAttribute(String name,Object object)存入数据
void removeAttribute(String name)删除数据
Object getAttribute(String name)获取数据
-
读取资源文件(*****)
InputStream getResourceAsStream(String path)//通过文件的地址获取输入流,path相对于服务器端的路径,即 ..../项目名 后面就根据资源文件的具体位置加载资源文件即可
String getRealPath(String path)通过文件的地址获取文件的绝对磁盘路径
-
-