从广义上来讲,Servlet规范是sun公司制定的一套技术标准,包含与web应用相关的一系列接口,是 web应用实现方式的宏观解决方案。而具体的servlet容器负责提供标准的实现。从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了servlet接口的实现类。servlet作为服务器端的一个组件,它的本意是“服务器端的小程序”。servlet的实例对象由Servlet容器负责创建;servlet的方法由容器在特定情况下调用; Servlet容器会在 web 应用卸载时销毁servlet对象的实例。
servlet的作用:
1、接收请求
2、处理请求
3、完成响应
Servlet HelloWorld编写Servlet的三步
- 创建自己的HelloServlet,实现Servlet接口实现service方法在web.xml中配置servlet信息
测试:运行项目,在浏览器中访问配置的url
代码 1、创建HelloServlet类,并实现Servlet接口,实现service方法 public class MyFirstServlet implements Servlet { //初始化 @Override public void init(ServletConfig servletConfig) throws ServletException { } //获取servlet配置信息 @Override public ServletConfig getServletConfig() { return null; } //服务 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //servlet是用来处理来自客户端的请求 System.out.println("我是第一个servlet"); //ServletResponse servletResponse 他能给浏览器发送一个响应 //获取一个写数据的对象 PrintWriter writer = servletResponse.getWriter(); writer.write("HelloWorld"); } //获取servelt信息 @Override public String getServletInfo() { return "abcdwe"; } //销毁 @Override public void destroy() { } }servlet的执行流程(响应客户端发来的请求) url统一资源定位符
url:统一资源定位符 静态资源:实际的文件.html .css .pong 动态资源:我们请求动态资源是启动一段程序来处理 动态资源 比如这个Servlet的生命周期/helloWorld 里面的helloWorld,在文件中没有这个静态资源MyFirstServlet com.atguigu.servlet.MyFirstServlet MyFirstServlet /helloWorld
Servlet的生命周期
Servlet是跑在Tomcat服务器上的
Tomcat服务器----->Servlet容器
生命周期:从出生到死亡的过程
Servlet的生命周期:Servlet从创建到销毁的过程
当我们第一次访问HelloServlet时
1)、创建了一个Servlet对象
2)、调用Init方法
3)、调用service的方法
以后请求
4)、只调用service方法来处理请求
当项目从服务器上卸掉的时候
5)、会调用destroy方法
destroy()servlet销毁方法,清理善后工作
ServletConfig的基本介绍:ServletConfig是封装了servlet配置信息的对象,一个servlet对象对应一个ServletConfig,封装当前servlet的配置信息
ServletConfig功能
获取servlet的别名:getServletName();
获取servlet的初始化参数
获取ServletContext对象。代表当前servlet的上下文。代表web项目信息
ConfigServlet com.atguigu.servlet.ConfigServlet //init-param这个就是servlet的初始化参数username pzx ConfigServlet /ConfigServlet
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println(config.getServletName()); System.out.println(config.getInitParameter("username")); System.out.println(config.getInitParameter("username")); //3、获取ServletContext对象。代表当前servlet的上下文。代表web项目信息 ServletContext context = config.getServletContext(); System.out.println(context); }
虚拟路径&真实路径对应
研究servletContext对象
1、是什么?代表?一个web应用代=代表一个ServletContext。就代表整个web应用
2、功能?
1)、可以获取web项目的配置信息,获取web项目的初始化参数。
ServletContext servletContext = config.getServletContext(); String user = servletContext.getInitParameter("user"); String username = servletContext.getInitParameter("username"); System.out.println(user); System.out.println(username);
2)、获取web项目的路径
String contextPath = servletContext.getContextPath(); System.out.println(contextPath);
3)、获取资源的真实路径
String realPath = servletContext.getRealPath("/index.jsp"); System.out.println(realPath);
4)、可以作为最大域对象共享数据 域对象:共享数据.4大域对象,application域对象
HttpServletHttpServlet原理图片
说明:HttpServletRequest request代表浏览器封装请求信息的对象,一个请求对应一个响应
HttpServletResponse response代表就是要发送浏览器的响应对象,封装我们的响应信息
response.sendRedirect:这个是响应的重定向
//1、可以给浏览器响应字符串 // PrintWriter writer = response.getWriter(); // writer.write("Hello HttpServlet....................."); //2、可以重定向到一个页面或者其他资,重定向就是服务器告诉浏览器请求别的资源 //我的处理代码.....已经对之前的request响应完了。 response.sendRedirect("success.html");HttpServletRequest
说明:HttpServletRequest request 代表随着浏览器发送给服务器的请求信息
http请求包括:请求首行 请求头 空行 请求体(封装请求数据-post)。
get请求和post请求的的获取请求参数 get放在url后面 post放在请求体里。
request来获取参数request来获取单个参数
String username = request.getParameter("username"); 这里面的参数是name值
request来获取多个参数:也就是些多选框中的内容,然后在使用增强for循环进行输出
String[] aihaos = request.getParameterValues("aihao");
请求转发和响应重定向的注意事项:写完转发之后,不能再写重定向,或者写完重定向之后不能再写请求转发,这是因为,一次请求对应一次响应。(也就是说,一次请求不能有两次响应)
重定向就是告诉浏览器重新请求新的资源。
转发:服务器处理完成之后转交到另外的资源。当我们转发的页面是一个页面(静态资源),服务器会给浏览器返回这个资源,当转交给下一个servlet,servlet可以继续处理(当然重定向也可以)
请求重定向:
第一个Servlet接收到了浏览器端的请求,进行了一定的处理,然后给浏览器一个特殊的响应消息,这个特殊的响应消息会通知浏览器去访问另外一个资源,这个动作是服务器和浏览器自动完成的,但是在浏览器地址栏里面能够看到地址的改变,会变成下一个资源的地址。
对浏览器来说,一共发送两个请求,所以用户是能够感知到变化的。
在重定向的情况下,不能共享Request对象中保存的数据。
转发和重定向的区别
请求转发和响应重定向的示意图
请求转发和响应的重定向的代码实现 请求转发public class MyServlet2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //HttpServletRequest request 代表随着浏览器发送给服务器的请求信息 //http请求。请求首行 请求头 空行 请求体(封装请求数据-post) //get请求将所要携带的参数放在url //1、获取请求参数 get放在url后面 post放在请求体里。 String username = request.getParameter("username"); System.out.println(username); // String aihao = request.getParameter("aihao"); // System.out.println(aihao); //使用getParameterValues来获取多选框选中的内容 String[] aihaos = request.getParameterValues("aihao"); if (aihaos!=null){ for (String str : aihaos ) { System.out.println(str); } } //2、获取请求头的相关信息 String accept = request.getHeader("Accept"); System.out.println(accept); String header = request.getHeader("User-Agent"); System.out.println(header); //3、转发一个页面/资源 //先获取一个请求转发器 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/haha.html"); //将请求转发出去 requestDispatcher.forward(request,response); //4、作为域对象共享数据 4个 application request } }响应的重定向
public class MyServlet3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //写代码 //经过MyServlet3处理之后,获取请求头信息。在控制台打印 String header = request.getHeader("User-Agent"); System.out.println("用户的浏览器信息"+header); //返回success.html页面,只能响应一个 //1、重定向到页面 就是告诉浏览器重新请求新的资源 //http:localhost:8080/success.html response.sendRedirect("http://www.baidu.com"); //2、转发到页面 //转发:服务器处理完成之后转交到另外的资源。当我们转发的页面是一个页面 //(静态资源),服务器会给浏览器返回这个资源 //当转交给下一个servlet,servlet可以继续处理 //这个先获取转发器,然后再进行转发 // RequestDispatcher requestDispatcher = request.getRequestDispatcher("http://www.baidu.com"); // requestDispatcher.forward(request,response); } }cookie&Session
cookie:服务器发送给浏览器要保存的数据浏览器保存相关的数据
HTTP是无状态协议;
无状态:服务器无法辨析每次请求来自谁?
如果客户端来的时候能带上类似会员卡的东西,记录卡号
服务器发给浏览器的"会员卡";
服务器让浏览器去保存一份数据,以后访问的时候,带上相应的数据
服务器发给浏览器
Filter filter的基本介绍web服务器的三大组件。Servlet,Flter,Listener
A filter is an object that performs filtering tosks on either the request to a resource (a servlet or static content),or on the response from a resource, or both.(
filter是用来执行过滤任务的一个对象,作用于:
1、请求一个资源(动态资源,JSP,静态资源)
2、来自一个资源的响应
3、两个都可以)
filter用来过滤请求和响应
1)、filter可以拦截请求(request),可以修改请求头,和请求内容
2)、filter可以拦截服务端的响应(response),可以修改响应头和响应内容
3)、放行请求 (当调用chain.doFilter();时候)
filter的执行顺序 filter-urlpatter配置url-patten (servlet也可以使用)
1、精确匹配
要写拦截的资源的详细路径 /hello.jsp /page/a.jsp
2、路径匹配:/路径名/* 代表所有
拦截所有访问(路径名下的资源) / 代表拦截所有
3、后缀匹配:*.后缀名
所有以指定后缀结尾的,都拦截
注意:/pics/*.jsp;不能
filter放行之前写出现中文乱码的原因HelloFilter /hello.jsp
现象:
1、在请求放行之前,使用response输出内容,内容追加到了页面上,但是页面的中文都出现了乱码
2、放行之前只要写中文就会出现乱码,带着页面出现乱码
3、放行之后写,完全没有问题
根本原因都是在放行请求之前 *** 作,或者直接 *** 作(没放行请求直接响应)
出现乱码的原理图
filterConfig主要用的就是下面那几个方法
public void init(FilterConfig config) throws ServletException { //FilterConfig是封装filter配置信息的对象 String filterName = config.getFilterName(); String wangba = config.getInitParameter("wangba"); //servletContext--->对应我门的web应用(一个web应用对应一个servletContext) ServletContext servletContext = config.getServletContext(); System.out.println(servletContext); //获取为web初始化参数 String user = servletContext.getInitParameter("user"); System.out.println("filter别名"+filterName); System.out.println("filter的初始化参数"+wangba); System.out.println("获取servletContext:" + servletContext); System.out.println("通过servletContext对象获取全局初始化参数"+user); }filter链
多filter的执行顺序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)