Servlet:
servler就是一个运行在Web服务器上的一个小的程序,用来接收和响应从客户端发送过来的请求,通常使用http协议
servlet 是sun公司提供的一个动态的网页开发技术
servlet 的作用
用来处理从客户端浏览器发送的请求,并且可以对请求发送响应
在使用servlet 时,需要编写一个类实现 Servlet 的接口,将编写的这个类配置到服务器中
public class ServletDemo1 implements Servlet{
@Override
/**
* 为用户处理请求和响应的方法.
*/
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().println("Hello Servlet...");
}
...
}
配置servlet文件在web.xml中进行配置 ,当浏览器访问指定路径时,会执行servlet
<!-- 配置Servlet -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>test1③</servlet-name>
<!-- SErvlet的全路径 -->
<servlet-class>com.itheima.a_servlet.ServletDemo1④</servlet-class>
</servlet>
<!-- Servlet的映射 -->
<servlet-mapping>
<!-- Servlet的名称 -->
<servlet-name>test1②</servlet-name>
<!-- Servlet的访问路径 -->
<url-pattern>/ServletDemo1①</url-pattern>
</servlet-mapping>
其中有一些方法可以 获取请求的路径,参数,数据
getMethod():获取请求方式 是get还是post方式
String getParameter(String name) :用于接受一个名称对应一个值的数据
String[] getParameterValues(String name):用于接受一个名称对应多个值的数据
Map getParameterMap();用于接受表单中的所有的数据,Map集合的key是表单提交的参数名称,Map的value是提交参数的值(该值可能是一个数组,所有在接受的时候Map泛型的值是一个数组)
小知识点;
如果当前项目使用的是tomcat 容器,在页面表单提交数据时,其实数据默认提交到tomcat 的webapps的路径下的项目中
原因是:在将项目配置到tomcat 上的时候,tomcat会将项目拷贝到webapps路径下,在方法访问的时,开始的/ 表示的是webapps目录
Servlet访问的流程:
1,客户端浏览器发送请求
2,服务器接收请求后,查找web.xml 中是否存在对应的访问地址
3,根据映射路径找到对应的Servlet处理类
4,调用servlet 方法
5,通过ServletRequest 获取页面传递过来的参数
6,通过ServletResponse 向浏览器输出内容
7,浏览器接收内容后进行显示
在web开发中,通常继承HttpServlet 类
Servlet 的生命周期,所以的周期就是一个对象从创建到销毁的过程
当用户第一次访问Servlet的时候,就会创建Servlet 的实例(访问其构造方法) 然后init方法执行
任何一次的请求都糊去创建一个新的线程,访问servlet中的service 方法
在Servie方法内部 会根据请求的方式进行不同的调用,doget还是dopost方法
当服务器关闭或者项目从服务器中移除,Servlet就会被销毁,destroy()方法就会执行
Servlet 的相关配置
<load-on-startup> 用于表示优先级,如果设置,该Servlet 在程序启动是就会调用init方法,数字越小优先级越高,但是1不能使用,是Servlet默认的,所以在使用的时候从2开始使用
Response
进行响应到浏览器端
设置响应头配置
addHeander(String name,String value) 将给定的名字和数值添加到响应头部
如果由多个value 则是在后面继续添加
addDateHeader(String name,long date) 将给定的名字和日期添加到响应的头部,
addIntHeader(String name,int value) 将给定的名字和整数值添加到响应的头部
setHeader (String name,String value ) 针对一个key 有一个value指的,将在原有的值上进行修改,而不是在后面继添加
setHeader(String name,String value)
setDateHeader(String name,long date)
setIntheader(String name,int value)
页面刷新
Response.setHeader("refresh" ,"5;url=' ' ")
重定向 ,跟状态码配合使用 302
Response.Status(302) 设置状态码
Response.setHeader('location"," /Demo/index.html ") 在html 中进行页面的跳转
在html 中进行页面的跳转
在html中进行网页的跳转
<head><meta charset="UTF-8">
<meta http-equiv="Refresh" content="5;url='/Demo01_Servlet/Count'" >
<title>Insert title here</title>
响应体:使用文件流读,用下面的方法进行写出 ,这两种方法 不能同时使用,一个是字符流一个是字节流
getOutputStream()
getWriter()
解决响页面输出中文乱码的问题 设置浏览器默认的打开编码格式(post)
response.setContentType(“text/html;charsert=utf-8”)
text/html;charsert=utf-8中的utf-8不需要加引号,会报错
get解决方案(有三种,说最常用的一种)
使用String 的构造方法 --- 推荐使用
根据不同浏览器解决乱码问题
// 根据浏览器的类型处理中文文件的乱码问题:
String agent = request.getHeader("User-Agent");
System.out.println(agent);
if(agent.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename,"UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
ServletContext对象(域对象) 作用于整个Web项目
所以在this.getServletContext() 的时候,其实路径就到了当前的项目下了
什么是域对象,
域对象 就是在其内部维护了一个Map<String .object>
域对象可以用来存储数据
每个域对象都有自己的作用范围
ServletContext 对象的特点
ServletConetext 对象是一个域对象 ,最用范围是整个web的应用 每个wen项目都有一个唯一的ServletContext 对象
在web应用被服务器加载的时候就会创建该对象,当服务器关闭,或者服务器中的项目移除的时候,就会销毁该对象
servletContext对象的获取
通过ServletConfig对象获取,或者在继承httpServlet之后,使用this.getServetContext 进行获取
ServletConetext对象常用的方法
- setAttribute(String name ,object object);用于保存数据
- getAttribute(String name);获取数据
- removeAttribute(String name);删除数据
- getInitParameter(String anme); 获得全局的参数
- getRealPath(String name); 为给定虚拟路径返回包含实际路径的 String
- getMimeType(String file) 返回指定文件的 MIME 类型,如果 MIME 类型未知,则返回 null, 常见 MIME 类型是 "text/html" 和 "image/gif"
ServletContext对象的作用域
1,用来获取 全局的初始化参数
例:
例:在web.xml的根元素下配置一下信息:
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
这些参数就属于整个应用的全局参数,使用ServletContext来读取。
this.getServletContext().getInitParameter("name");
2,用来获取文件的mime类型 参数值是文件的路径
this.getServletContext.getMimeType("/dome.html")
3,作为域对象存取数据
this.getServletContext().setAttribute("count", 0); setAttribute:设置初始值,在init中进行初始化
this.getServletContext().getAttribute("count"); getAttribute:获取里面的count键的值
常用的方法:
- String getServletName();获得Servlet在web.xml中配置的name的值.
- getServletContext(); 获取ServletContext对象
- getInitParameter(String name);获得servlet初始化数据
1、在web.xml中增加如下配置
<servlet>
<servlet-name>
ServletDemo7
</servlet-name>
<servlet-class>
com.itheima.a_servlet.ServletDemo7
</servlet-class>
<!-- 配置初始化参数 -->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo7</servlet-name>
<url-pattern>/ServletDemo7</url-pattern>
</servlet-mapping>
注意:只在当前servlet中有效
getInitParameterNames();获得所有Servlet的初始化参数的名称
可以获取的servlet配置文件中的信息的原理
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息
Request和Response 的不同
HTTP 请求部分
请求行,请求方式,请求路径,协议版本
请求方式,POST 和 get
请求方式很多,但是最常用的就是get和post
区别:
get有大小限制,参数在地址栏中显示
post 没有大小限制,参数存放在参数体中
请求路径要访问那个路径中的内容
协议版本,使用 版本 1.1
1.0 :连接一次 就会断开连接
1.1: 连接一次不会接着断开,而是过一段时间之后么有请求的时候会断开
请求头,键值对的存在
Referrer : 网页的来源,用于防盗链
User-Agent 浏览器的类型和一些基本的额信息
if-modified-Since 跟响应头的Last-modifide一起使用,用于查询本地的缓存
请求体:post 的提交参数在请求体中,get提交的参数在地址啦中
Request 作为域对象存储数据
Request 的作用范围
作用的返回是一次请求
创建:客户端想服务器发送一次请求之后,服务器就会创建一个Request 对象
销毁 : 当服务器对这次请求做出了响应之后,就会被销毁
重定向和转发的区别:(redirect和forward)
重定向的地址会发生改变,转发的地址不会发生改变
重定向需要两次请求和两次响应,转发一次,请求一次
重定向可以访问任意网站,转发只能访问服务器内自己的网站
重定向需要加工程名,而转发不需要加工程名(自己访问自己)