文章目录
- 前言
- 一、Servelet概述
- 1.1 简单入门:
- 2.2 生命周期
- 二、HttpServletRequest对象
- 2.1 常用方法
- 三、HttpServeletResponse对象
前言
九月,加油
一、Servelet概述
Servelet: server applet
servelet就是一个接口,定义了Java类被浏览器访问到的规则,内部一共包含了五个抽象方法:
- destory():当服务器正常关闭时,销毁Servlet对象调用一次,仅调用一次
- getServeletConfig():获取ServletConfig对象(Servlet的配置对象)
- getServeletInfo():获取Servlet的一些信息,版本,作者等等
- init(ServeletConfig config) :在Servlet创建时调用一次,仅调用一次
- service(ServeletRequest req,ServeletResponse res):每次请求服务都会调用一次,调用多次
1.1 简单入门:
1.创建项目
2.定义一个类,实现Servelet接口
3.实现接口中的抽象方法
4.配置Servlet(即在xml文件中,配置实现类全面名到名称的映射,以及该名称带url路径的映射)
例如:http://localhost:8080/pro1/demo1
- localhost:8080 ip地址+端口号
- /pro1 项目的对外访问路径
- /demo1 被访问类的对外访问路径
大致的一个过程是这样的:浏览器首先通过localhost访问到对应的主机,然后尝试请求连接该主机的8080端口以获取在该端口上运行的服务器服务(tomcat服务器会默认占用8080端口),tomcat会根据项目路径进行检索,找到部署在服务器上的对应的项目。然后根据具体的资源路径,到项目中的xml文件中检索是否存在url-pattern的值为/demo1,如果存在,获取到这个资源路径所对应的< servelet-name >标签体内容,然后再根据查询到的servlet-name检索该name对应的类文件的权限名。tomcat根据得到的全限名加载相应的字节码文件到内存中。然后创建一个类的实例(也就是一个Servlet对象),当处理请求到达时,服务器会将请求转交给类的实例调用类中实现的service方法(Servlet接口所规定的方法)来进行处理。
2.2 生命周期
- 1.被创建:执行init方法,只执行一次
- Servlet默认情况下在第一次被访问时创建,如果需要也可以通过配置来更改Servlet创建的时机
- 由于init方法只会执行执行一次,说明Servlet在内存中只存在一个对象,即单例的。所以在多个用户同时访问时可能会存在安全问题。所以尽量不要在Servlet中定义成员变量,及时定义了成员变量也尽可能不对其进行修改操作。
- 2.提供服务:执行service方法,每次请求服务都会执行一次
- 3.被销毁:执行destory方法,当服务器正常关闭,销毁Servlet对象时会执行一次
tips:基础概念回顾
- 软件架构
C/S : 客户端/服务器模式
B/S : 浏览器/服务器模式
- 资源分类
静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以 直接被浏览器所解析。如:html,css,JavaScript
动态资源:每个用户访问相同的资源后,得到的结果可能是不一样的,称为动态资源。动态资源在访问时,需要先转换为静态资源,然后再返回给浏览器解析。如:servlet/jsp,php,asp…
二、HttpServletRequest对象
主要用来接收客户端发送过来的请求信息,例如请求方法,请求协议版本,请求参数等等,这些信息都会被Tomcat封装到request对象中进行传递,后端所需要做的就是从中取出数据,然后进行分析处理。
2.1 常用方法
http://localhost:8080/sr02/s01?uname=admin&upwd=123456&hobby=sing&hobby=dance
/*常用方法 */
//获取请求时的完整路径(从http开始,到"?"前面结束)
String url = request.getRequestURL()+ "";
System.out.println("获取请求时的完整路径:”+url); //http://localhost:8080/sr02/s01
//获取请求时的部分路径(从项目的站点名开始,到"?"前面结束)
String uri =request.getRequestURI();
System.out.println("获取请求时的部分路径:"+uri); ///sr02/s01
//获取请求时的参数字符串 (从"?”后面开始,到最后的字符串)
String queryString=request.getQueryString();
System.out.println("获取请求时的参数字符串:"+ queryString); //uname=admin
//获取请求方式(主要是GET和POST)
String method = request.getMethod();
System.out.println("获取请求方式:”+ method);
//获取当前协议版本
String prototol = request.getProtocol();
System.out.println("获取当前协议版本:"+ prototol);
//获取项目的站点名(项目对外访问路径)
String webapp =request.getcontextPath();
System.out.println("获取项目的站点名’+webapp); ///sr02
//重点:获取指定名称的参数值,返回字符串
String name = request.getParameter("uname"); //名称即请求中的参数名称,要保持一致,admin
String upwd = request.getParameter("upwd"); //123456
//重点:获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
String hobbys[] = request.getParameterValues("hobby");
//判断数组是否为空
if(hobbys != null && hobbys.length() > 0){
for(String s:hobbys){
sout(s); //sing
//dance
}
}
三、HttpServeletResponse对象
HttpServeletResponse的主要功能用于服务器对客户端的请求进行响应,将Web服务器处理后的结果返回给客户端。service()方法中形参接收的是HttpServeletResponse接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头、发送状态码的方法。
接收到客户端请求后,可以通过HttpServeletResponse对象直接进行响应,响应时需要获取输出流。有两种形式:
- getWriter() 获取字符流(只能响应回字符)
PrintWriter writer = response.getWriter();
writer.write("Hello");
- getOutputStream() 获取字节流(能响应一切数据)
ServletOutputStream out = response.getOutputStream();
out.write("Hello".getBytes());
响应回的数据到客户端被解析。但是两者不能同时使用,因为response对象只有一个。