Servlet的作用
1.接受客户端的请求,动态生成网页。
2.调用业务逻辑层
3.转发和重定向
http协议
无状态:每次连接,都是新的。
无连接:有链接,每次用完都断开。
面试题
一个页面,中有四张图片,发送了几次请求?
http1.1:建立一次连接,5次请求(1次请求网页,四次请求图片)。
http1.0,建立5次连接,5次请求。
请求报文
响应报文
常见的错误
创建Servlet对象(放在内存中)
1.实现Servlet接口。
//必须实现1。(只执行一次)
init(ServletConfig config);
//获取Servlet的配置
ServletConfig getServletConfig();
//服务方法,处理浏览器请求的方法,
//req:请求对象,封装请求的信息
//res:响应对象,封装响应信息
service(ServletRequest req, ServletResponse res);
//获取servlet的基本信息,版本,作者等
public String getServletInfo();
//销毁:tomcat关闭,会执行destory,只执行一次
第一次访问Servlet时会创建Servlet对象,并执行init方法,再执行service()方法
第二次访问Servlet时,有了Servlet对象,只执行service()方法。
…
当tomcat关闭时,会执行destory()方法,会销毁Servlet对象。
与浏览器无关,只有一个Servlet对象,除非tomcat关闭,才销毁Servlet对象。
2.继承GenericServlet或者HttpServlet(一般选这个)
重写doget()和dopost的方法
可以在dopost()方法中调用doget()方法,这样只需写一个,两个方法都能调用。
用浏览器访问的都是get请求,form表单里能选get或者post请求
Servlet的配置方式
一个servlet能有多个访问路径。
但是访问路径不能重复
/bs2相当于在这个路径下,requset.getContextPath()/bs2,所以访问Servlet,只需在上下文路径后面/bs2就可以。
/*.xxx不能这么写。
/aaa/bbb/* 匹配/aaa/bbb/开头的地址或者/aaa/bbb
/aaa/*/aaa 匹配/aaa/*/bbb
/aaa/bbb/ 匹配/aaa/bbb/开头的地址
不写/,不使用后缀匹配,会出现 Invalid<url-pattern>in servlet mapping
servlet加载时机
1.第一次访问servlet时创建(默认)
2.启动tomcat时创建
能修改创建的时机
<servlet>
<servlet-name>Servlet2</servlet-name>
<servlet-class>com.qf.Servlet2</servlet-class>
//默认值是-1,表示第一次访问servlet创建
//修改成>=0时,启动时创建,数越小,优先级越高。(整数)
<load-on-startup></load-on-startup>
</servlet>
Servlet的生命过程
Servlet参数
<init-param>
<param-name>username</param-name>
<param-value>xiuer</param-value>
</init-param>
//在这能捕获<init-param>设置的参数
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println(this.getClass().getName()+this.hashCode());
String username = servletConfig.getInitParameter("username");
}
//如果Servlet继承的是HttpServlet类,因为有getServletConfig()方法,得到ServletConfig对象。
String username = getServletConfig().getInitParameter("username");
System.out.println(username);
通过注解配置Servlet
注解配参数
@WebServlet(value ={"/pattern","/pattern1"} ,loadOnStartup = 0,initParams = {@WebInitParam(name="username",value = "xiaoming"),@WebInitParam(name="age",value = "18")})
Servlet的安全性
request
处理客户端请求需要request对象
request对象包含了客户端请求的所有的内容
服务器默认ISO-8859-1编码接受。get请求没有问题。post请求会有中文乱码的问题。
String username = request.getParameter("username");
//获取数组
String[] hobbys =request.getParameterValues("hobby");
get没有问题,post有中文问题。
//设置编码
request.setCharacterEncoding("utf-8");
//tomcat默认ISO-8859-1
//获取请求头
request.getHeader("Accepter")
//获得请求方式
request.getMethod()
//得到地址(Uinform Resouce Identifier 统一资源标识符)
request.getRequestURI()
//得到整个地址(Uniform Resouce Locator)统一资源定位符
request.getRequestUIL()
//获取IP地址
request.getRemoteAdder()
response
//服务器响应
//设置编码(一定要在获取流的前面)
response.setCharacterEncoding("utf-8");
//1.设置内容的类型,采用响应头的方式告诉浏览器我采用的编码,推荐使用
response.setContentType("text/html;charset=utf-8");
//2.
//response.setHeader("ContentType", "text/html;charset=utf-8");
//获取字节流,把二进制(图片,声音)数据发给浏览器要用这个流
//ServletOutputStream outputStream = response.getOutputStream();
//获取字符流,把文本数据发送给浏览器,二者不能同时用。
PrintWriter writer = response.getWriter();
//发送,可以不用关流和flush,
writer.write("<h1>nihao,秀我</h1>");~
转发与重定向
转发