Servlet:Server applet,服务器端的小程序,用来动态的输出网页内容
狭义上就是Java中的一个接口
广义上就是实现了该接口的实现类,我们通常说的Servlet就是这种
Servlet的开发步骤:
1.创建JavaWeb项目
1).创建一个JavaProject:HelloServlet
2).在项目中创建一个web项目的根目录:webapp
3).在根目录中创建一个WEB-INF文件夹
4).在WEB-INF中创建一个classes文件夹,存放字节码文件
5).在WEB-INF中创建一个lib目录
6).在tomcat/webapps/root/WEB-INF目录中拷贝web.xml文件
2.开发Servlet
1)导入Servlet相关的jar包:servlet-api.jar
在tomcat/lib目录中找
2).定义一个类,实现javax.servlet.Servlet接口,并覆盖其中的方法
3).将Servlet交给Tomcat来管理其生命周期
(在web.xml文件中进行如下的配置)
<servlet>
<servlet-name>MappingServlet</servlet-name>
<servlet-class>com.hello.mapping</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 一个Servlet可以有多个url-pattern -->
<!-- url-pattern 不能为default__如果是default就不能访问当前项目中的静态文件 -->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.部署项目
在tomcat/conf/server.xml文件中进行项目的部署
<Context docBase=”web项目的根路径” path=”上下文路径”/>
Servlet的生命周期
public void destroy():销毁方法
public String getServletInfo():获取Servlet的相关的信息
public void init(ServletConfig config):Servlet的初始化方法
public ServletConfig getServletConfig():获取Servlet的配置对象
public void service(ServletRequest req, ServletResponse res):服务方法
Servlet的生命周期方法:Servlet在整个应用中只有一个对象,单例的
1.构造器在第一次请求的执行
2.初始化方法在第一次请求的时候执行
3.service方法在每次请求的时候都会执行
4.destroy方法在正常关闭服务器的时候执行,所以资源销毁的操作通常不会放在该方法中(可能执行不到)
5.为了服务器能够顺利的通过反射创建Servlet对象,在Servlet中必须保留一个公共的无参数的构造器
Servlet的请求流程
1.解析请求:
协议:http
主机地址:localhost
端口:80
上下文路径:/pss
资源名称:/hello
2.通过/pss在server.xml文件中找到相关的配置,找到项目的根路径
<Context docBase=”项目的根路径” path=”/pss”/>如果没有:返回404
3.通过/hello去项目中的web.xml文件中找到<url-pattern>为/hello的节点
如果没有:返回404
4.通过资源名称找到Servlet的全限定名
5.在Tomcat中有一个Servlet的实例缓存池
Map<String,Servlet> cache = ......
先从缓存池中获取对应全限定名的Servlet对象
Servlet obj = cache.get(“Servlet 的全限定名”);
if(obj == null){
//第一次
//GOTO 6;
}else{
//非第一次
//GOTO 8;
}
6.创建Servlet对象
obj = Class.forName(“全限定名”).newInstance();
将创建好的对象放到缓存池中
cache.put(“全限定名”, obj);
7.先创建ServletConfig对象,调用初始化方法
obj.init(config);
8.先创建ServletRequest,ServletResponse对象,调用service方法
obj.service(req,resp);
9.返回响应信息

servlet 请求的中文乱码处理
Tomcat中默认处理请求参数的编码方式是ISO-8859-1,不支持中文的处理
解决方案:
1.拆,将按照ISO-8859-1编码之后的数据按照同样的方式进行拆分
bytes = username.getBytes(“ISO-8859-1”);
装,将字节数组按照UTF-8的方式进行编码
username=new String(bytes, “UTF-8”);
以上的方式可以解决乱码,但是如果需要解决的数据非常多,那么就变得非常麻烦
2.可以通过修改server.xml文件中的配置,只针对get方式生效
3.可以调用request对象中的setCharacterEncoding(String encoding);,只针对post方式生效
Servlet3.0新特性-注解配置
使用注解的准备工作:
第一步:在Servlet类上贴@WebServlet(urlPatterns=“/anno”)
第二步:
metadata-complete="true":表示不扫描类上的注解
metadata-complete="false":表示扫描类上的注解,缺省值
使用注解可以将metadata-complete设置为false,也可以删除这个属性,也可以将web,xml文件删除
注意:注解只是替代web.xml文件中的部分配置
也就是说web.xml那么在项目中建议保留
Servlet线程安全问题
servlet的线程安全问题的根本原因:多线程并发访问同一个资源的时候造成的
Servlet的特点:单例的
解决方案:
方式一:可以让servlet实现一个接口:SingleThreadModel,表示当前的servlet同时只能被一个线程访问(不推荐)
方式二:建议以后在servlet中不要随便的使用成员变量(推荐)