Servlet (二) 之 Servlet技术和Servlet对请求的处理

Servle技术

概念:即一个类这个类实现了Servlet接口

Servlet技术的特点

(1)运行在支持java的应用服务器上

(2)Servlet的实现遵循了服务器可以识别的规则,也就是服务器可以根据请求自动调用相应的Servlet类进行请求处理

(3)简单快捷,可移植性强

Servlet技术的使用

1、创建普通的java类并继承HttpServlet

2、覆写service方法并在service方法书写逻辑代码

4、在WebRoot下的WEB-INF文件夹下的web.xml文件中配置servlet

Servlet运行流程

访问方式:http://localhost:8080/Demon/demon

组成:“服务器地址:端口号/webapps目录下的文件夹的名称(虚拟项目名)/要执行的servlet的url-pattern”

​ 或 “服务器地址:端口号/虚拟项目名/servlet的别名”

注1::虚拟项目名:Myeclipse中的项目名 别名:web.xml中标签中的内容)

注2:服务器地址+端口号 ”可以定位到一个应用程序(即服务器所在的位置)

注3:“服务器地址:端口号/webapps目录下文件”—>即此时服务器已经找到要执行的具体项目

注4:唯一可以标识一个java类的是:包名+类名

注5:为了安全考虑,我们要在web.xml中配置servlet的别名用于让服务器辨别。当服务器根据输入的地址可以找到想要运行的具体项目–>根据servlet的别名在web.xml查找对应的类名和对应的包名(因此web.xml的作用就是保护servlet更加保密性和安全性)


Servlet的生命周期

  1. 从Servlet第一次调用被加载到内存到服务器关闭(期间一直存在)
  2. 如果Servlet中在web.xml中配置了1那么它的生命周期是:从服务器启动到服务器关闭。

注1:当用户第一发起请求是servlet会被加载到内存,此时如果删除tomcat服务器目录下的webapps文件夹下的项目下的servlet文件进行删除后在进行请求操作仍然不会出错,因为当类被调用的时候已经被加载到内存中了,那么什么时候发起调用会报错呢?(当servlet被销毁时即此时内存中不存在这个文件).servlet第一次加载进了Tomcat内存只要服务器不关闭它就必须一直存在(不可以被销毁),因为我们不确定用户什么时候会发起请求,只有当服务器关闭之后才可以对其进行销毁。

注2:当服务器启动的时候web.xml会被加载到内存,但是只有浏览器发起servlet请求的时候Tomcat服务器才会拿着请求去使用web.xml中的内容:即通过web.xml里面的找到对应的从而找到对应的(有上可知:当第一次对servlet进行调用的时候响应的类才会被加载到内存)。

注3:init()方法是对servlet进行初始化的一个方法,会在servlet第一次被调用加载到内存时调用(调用一次);destory()方法是在servlet被销毁的时候被调用,也就是服务器被关闭的时候调用。


service和doGet和doPost方法

  1. Service方法:不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
  2. doPost方法:在没有service方法的情况下,如果是post方式的请求则调用doPost方法
  3. doGet方法:在没有service方法的情况下,如果是get方式的请求则调用doGet方法

注:由servlet的生命周期可知,只要发起请求对应的servlet的class文件就会被加载到内存,此时即使把它删除(指的是从服务中删除,内存中不会被删除除非是服务器被关闭即对其进行销毁)只要在myeclipse对其进行保存,它就会帮我们把这个文件复制到Tomcat服务器的webapps目录下,但是服务器加载的却是上一次在内存中保存的servlet的class文件;因此每次对servlet进行修改时需要重启服务器


servlet常见错误

404错误:资源未找到错误

原因一:在请求地址中的servlet的别名书写错误。

原因二:虚拟项目名称拼写错误

500错误:内部服务器错误

错误一:java.lang.ClassNotFoundException:com.bjsxt.servlet.ServletMothod

*解决:*在web.xml中校验servlet类的全限定路径(包和类路径是否正确)是否拼写错误。

错误二:因为service方法体的代码执行错误导致

*解决:*根据错误提示对service方法体中的代码进行错误更改。

405错误:请求方式不支持

原因:请求方式和servlet中的方法不匹配所造成的。

*解决:*尽量使用 service 方法进行请求处理,并且不要再 service 方法中调用父类的
service。


Servlet对请求的处理

问题:当浏览器对服务器发起请求时(当然此时是遵守http协议将请求数据发送给服务器),服务器接收到数据后要怎么对数据进行存储呢?(在存储的时候还要保证数据的完整性)

解决:在java中存储数据一般都是使用变量或者对象。显然这里请求数据都是以键值对的形式存在,并且数据量多,因而这里使用对象来对数据进行存储。(服务器每接收一个请求,就会创建一个对象来专门对这次的数据进行存储。)

要知道的:我们将保存到数据对象(request)作为实参传到service方法中;即此时service方法已经拿到了浏览器请求的数据。也就是Tomcat服务器的作用是调用service方法并将请求对象作为实参传递到此方法中,而我们所要做的就是拿到请求对象然后获取里面的数据并使用。

request对象

解释:request对象存储了此次请求相关的请求数据

使用:

  1. 获取请求头数据

    //获取请求方式
    req.getMethod();
    //获取请求URL
    req.getRequestURI();
    //获取URI
     req.getRequestURI();   
    //获取协议
    req.getScheme();
    
  2. 获取请求行数据

    //获取指定请求行的信息:返回指定请求头的信息eg:User-Agent、Host
    req.getHeader("键名");
    //获取请求行的所有的键的信息:返回请求头的键名的枚举集合获取用户数
    req.getHeaderNames();
     //获取请求行所有键的信息(枚举类型)
    	Enumeration e = req.getHeaderNames();
         	while(e.hasMoreElements()){
                String name = (String) e.nextElement();
                String value = req.getHeader(name);
                System.out.println(name+" : "+value);
            }
    
  3. 获取用户数据

    // 返回指定的用户数据
     req.getParameter("键名");
    //返回同键不同值的请求数据
     req.getParameterValues("键名"); 
    //返回所有用户请求数据的枚举集合(注意:如果请求数据不存在则返回null)
     req.getParameterNames(); 
    

response对象

问题;我们使用request对象保存请求数据并进行相相应的处理后,处理的结果又是怎样显示到浏览器中呢?

解决:使用response对象

解释:服务器在调用指定的servlet对请求进行处理的时候,会给service传递两个实参reqeust和response。其中request对象中封存了请求相关的信息;而response对象封存了对请求做出处理响应的结果

使用:

  1. 设置响应头

    resp.setHeader(String name, String value);
    resp.addHeader(String name, String value);
    
  2. 设置响应状态

    //自定义响应状态码
    sendError(int num, String meg)
    
  3. 设置响应实体

    //响应具体的数据给浏览器 
    resp.getWrite().write(String str);
    
  4. 设置编码格式

    //告诉浏览器以"text/html"的形式;"utf-8"编码来读取此文件
    resp.setContentType("text/html;charset=utf-8")

servlet流程总结

  1. 浏览器向服务器发送求信息

  2. 服务器接收到请求进行解析,创建request对象用来存储数据,并调用响应的servlet进行请求处理,同时将request对象作为service方法的实参

  3. servlet方法的执行来进行请求处理(这也正是程序员所要做的工作)

    • 设置请求编码格式和响应编码格式
    • 获取请求信息
    • 处理请求信息
    • 响应处理结果

    注1:处理请求信息:(MVC思想):创建业务层对象、调用业务层对象的方法

    注2:数据的流转

    浏览器——>服务器——>数据库

    浏览器<——服务器<——数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值