文章目录
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的生命周期
- 从Servlet第一次调用被加载到内存到服务器关闭(期间一直存在)
- 如果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方法
- Service方法:不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
- doPost方法:在没有service方法的情况下,如果是post方式的请求则调用doPost方法
- 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对象存储了此次请求相关的请求数据
使用:
-
获取请求头数据
//获取请求方式 req.getMethod(); //获取请求URL req.getRequestURI(); //获取URI req.getRequestURI(); //获取协议 req.getScheme();
-
获取请求行数据
//获取指定请求行的信息:返回指定请求头的信息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); }
-
获取用户数据
// 返回指定的用户数据 req.getParameter("键名"); //返回同键不同值的请求数据 req.getParameterValues("键名"); //返回所有用户请求数据的枚举集合(注意:如果请求数据不存在则返回null) req.getParameterNames();
response对象
问题;我们使用request对象保存请求数据并进行相相应的处理后,处理的结果又是怎样显示到浏览器中呢?
解决:使用response对象
解释:服务器在调用指定的servlet对请求进行处理的时候,会给service传递两个实参reqeust和response。其中request对象中封存了请求相关的信息;而response对象封存了对请求做出处理响应的结果
使用:
-
设置响应头
resp.setHeader(String name, String value); resp.addHeader(String name, String value);
-
设置响应状态
//自定义响应状态码 sendError(int num, String meg)
-
设置响应实体
//响应具体的数据给浏览器 resp.getWrite().write(String str);
-
设置编码格式
//告诉浏览器以"text/html"的形式;"utf-8"编码来读取此文件 resp.setContentType("text/html;charset=utf-8");
servlet流程总结
-
浏览器向服务器发送求信息
-
服务器接收到请求进行解析,创建request对象用来存储数据,并调用响应的servlet进行请求处理,同时将request对象作为service方法的实参
-
servlet方法的执行来进行请求处理(这也正是程序员所要做的工作)
- 设置请求编码格式和响应编码格式
- 获取请求信息
- 处理请求信息
- 响应处理结果
注1:处理请求信息:(MVC思想):创建业务层对象、调用业务层对象的方法
注2:数据的流转
浏览器——>服务器——>数据库
浏览器<——服务器<——数据库