目录
一、什么是Servlet
二、使用IDEA创建一个servlet程序全过程图解:
关于映射路径:
三、servlet的执行流程:
3.1 引入概念 容器
什么是容器:
容器可以用来干嘛:
3.2 Servlet的执行流程:
四、http协议:
4.1 常见的请求头:
4.2常见的响应头:
4.3 通过servlet获取http请求信息:
4.3.1 获取请求行的信息
4.3.2 获取请求头基本信息
4.3.3 获取表单参数的值
4.3.4 非法链接
4.4 通过servlet获取http响应信息
4.4.1 重定向
4.4.2 定时刷新
4.4.3 设置响应类型
4.4.4 以下载的格式打开
Servlet是Java Servlet的简称。Java Servlet 是运行在web服务器上的应用程序,简单来说,其实它就是一个类,能够被web服务器解析的一类。
总的来说,servlet的功能主要就是干两件事:
servlet遵循的是网络协议中的 http协议 ;
刚开始可以这么理解servlet的作用 :
首先,在官网下载一个Tomcat:
解压后,进入里面的bin目录,找到对应的启动文件:
windows下的启动文件是startup.bat
linux下的启动文件为startup.sh:
启动一下,保证可以运行(不会闪退):
如果闪退的话,可能是你没有配JAVA_HOME环境变量(网上有步骤),或者下的Tomcat的版本有问题也可能导致闪退。
然后就可以在IDEA下手动创建一个Servlet程序:
首先,创建一个空的maven项目
然后步骤就是正常创建项目的步骤...
然后在pom文件中将打包设置为war包
接下来补全目录结构:web项目的目录结构为:在main下面创建一个webapp,在webapp下面创建目录WEB-INF,在WEB-INF中创建一个web.xml文件:
在补一下web.xml文件中的内容(直接在Tomcat安装目录里的WEB-INF里面的web.xml文件中将下面部分的内容复制过来在最后补一个就行了,如下图):
或者直接复制这个:
web.xml是servlet的配置文件,Servlate里面的全局参数,监听器,过滤器都是在这里面,所以非常重要,怎么用后面再说!!!
然后再pom文件中导入Servlet需要的jar包:
javax.servlet
javax.servlet-api
3.1.0
provided
然后在:Run -> Edit Configurations--> 点左上角的 + -->然后在下拉框找到Tomcat server --> 选择Local(表示本地) --> 然后name里面自己填一个名字,在Application server里面找到自己下载的Tomcat,这时右下角如果有一个红色感叹号的警告,点fix,选择 xxxWar,然后点击应用,并确定,这样我们的Tomcat就算是配好了,具体过程如下图:
确定之后:
然后点apply 然后OK。到这里我们就可以创建Servlet项目了。
这时候在我们自己的包下创建一个servlet:
这个时候如果 左下角那个对号点不了,就重新导一下maven项目,如下图:
创建好了之后,web.xml中会报错,如下:
现在,要在web.xml中写上:
作用:在运行servlet的时候,首先它就会来web.xml文件中找对应的映射路径,找到了才可以运行
写法:
优先级比较:
再来看看新建的这个servlet的类,里面默认覆写两个方法:
一般情况下,我们常用doGet(), 在doPost中直接调用doGet就可以了。
简单的使用案例:第一个servlet
点击运行之后,由于我们这里没有配主页,进来之后再浏览器会报错(404 ),不过对于练习使用案例来说并不影响什么。
这时候在地址栏输入刚刚在web.xml中配置的:
回车之后就有东西了:
那么要在浏览器输入中文,要先设置编码为utf-8:
其实上面的setContentType中的ContentType就是http协议请求头中的东西,我们可以在刚刚那个界面按F12(我用的浏览器是按F12,别的不清楚)就可以看到http 请求头 / 响应头 中的详细信息:
从上面的方法我们可以看出,servlet好像和我们之前写的程序不太一样,它里面main方法,但是也可以执行,那么servlet到底是怎么执行的呢???
从上面的步骤来看,我们会发现servlet和我们平时写的程序不太一样,因为它没有main方法,也可以执行,但是在以前不是说main方法是程序执行的入口吗,那为啥servlet就可以例外了呢;因为servlet程序受控于另外一个java应用,这个应用就是容器,servlet程序就是在这个叫容器的东西里面运行的。在刚开始我们说的要下载的Tomcat,就是常见的容器中的一种,常见的还有 Jetty。
容器是用来管理和运行servlet的
Accept | 浏览器接受的数据类型 |
Accept-Charset | 浏览器接受数据编码格式 |
Accept-Encoding | 浏览器接受的数据压缩格式 |
Accept-Language | 浏览器接受的语言 |
Host | 请求发出的主机和端口(必须) |
If-Modified-Since | 浏览器缓存的最后修改时间 |
Referer | 当前请求来自于哪里 (防止非法链接) |
User-Agent | 当前用户的浏览器类型 |
Cookie | 浏览器保存的cookie数据(会话管理) |
Connection | 浏览器和服务器的连接状态。 close:关闭。keep-alive:保持连接 |
Date | 请求发出的时间 |
Location | 重定向的地址。结合302状态使用完成重定向的效果 |
Server | 服务器的类型 |
Content-Encoding | 服务器发送给浏览器的数据压缩格式 |
Content-Length | 服务器发送给浏览器的数据长度 |
Content-Language | 服务器支持的语言 |
Content-Type | 服务器发送给浏览器的数据类型和数据编码格式 |
Last-Modified | 服务器资源的最后修改时间 |
Refresh | 定时刷新或者每隔n秒天真资源 |
Content-Disposition | 以下载方式打开资源 |
Set-Cookie | 服务器发送给浏览器的cookie数据 |
Expires(-1) | 通知浏览器不使用缓存 |
Connection (close/Keep-Alive) |
连接状态 |
Date | 响应发出时间 |
请求行:请求行由3部分组成
代码获取:
运行结果:
运行结果:
首先,写一个简单的html的form表单如下:
title
get提交方式
post提交方式
运行结果为:
get 和 post 方式提交的数据,其获取方法完全不一样,获取参数的方式如下:
调用 getQueryString()方法获取(Tomcat8.0以上的版本不用解决乱码问题,在内部已经对编码问题解决了)
通过InputStream流读取参数(post方式需要解决乱码问题)
也有一种通用的获取参数的方式:
requset.getParameter(String name) 返回 String value
使用案例:
get方式:
运行结果:
post方式:
运行结果:
通用方式获取:
运行结果:
非法链接指的是
运行结果:
现在在webapp目录下用HTML写一个简单的广告页面adv.html :
adv
广告链接...
跳转到资源地址
然后再来试试获取referer
运行结果:
实现方式1:
实现方式2:
运行结果:
这个在上面已经用过了,比如:来在浏览器输出中文的时候不会乱码
response.setHeader("content-type", "text/html;charset=utf-8"); ==》简写方式: response.setContentType("text/html;charset=utf-8");
运行结果:
response.setHeader("Content-Disposition", "attachment;filename="+file.getName());
public class DownLoadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 1、创建一个File对象
File file = new File("D:\\图片\\1.jpg"); //这个是要下载的文件
// 2、设置响应头
response.setHeader("Content-disposition", "attachment;filename="+file.getName());
// 3、创建一个字节流输入对象
InputStream in = new FileInputStream(file);
// 4、获取字节输出流对象
OutputStream out = response.getOutputStream();
// 5、定义一个缓冲数组
byte[] buff = new byte[1024];
// 6、边读边写
int len = 0;
while ((len=in.read(buff)) != -1)
{
out.write(buff, 0, len);
}
// 7、关闭资源
in.close();
out.close();
}
}
运行结果: 下载文件