02_Servlet开发与应用

本文详细介绍了Servlet的概念、开发步骤、生命周期及线程安全问题等,并探讨了Servlet3.0的新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.返回响应信息


![这里写图片描述](https://img-blog.youkuaiyun.com/20160815010330390)

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中不要随便的使用成员变量(推荐)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值