一、什么是servlet,干什么用的???
tomcat作为一个web服务器,也称作servlet容器。servlet只有放在web服务器中才能运行,不能独立运行。tomcat这个容器要做三件事:接收请求、处理请求和响应请求。接收和响应请求没有什么区别,tomcat内部就写好了怎么做。只有处理请求需要程序员自己编写,但是编写不能是胡乱编写的,于是有了servlet接口提供规范。
servlet并不神秘,只是一个接口,我们实现了这个接口就能做处理请求的逻辑编写。
servlet就是处理请求逻辑的抽取,就是一个接口
在学习完spring框架后,我们就不用自己编写servlet程序。spring中的DispatcherServlet其实本质就是一个Servlet。
二、怎么编写servlet程序
1.自定义类继承httpservlet(一个抽象类)从而继承GenericServelet类。我们需要重写doGet()和doPost()两个方法。
2.配置web.xml文件
配置javaweb三大组件:
- servlet
<servlet>
<!-- servlet的内部名称,自定义 -->
<servlet-name>DemoAction</servlet-name>
<!-- servlet的类全名:包名+类名 -->
<servlet-class>com.uplooking.controller.DemoAction</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致 -->
<servlet-name>DemoAction</servlet-name>
<!-- servlet的映射路径(访问serclet的名称 -->
<url-pattern>/DemoAction</url-pattern>
</servlet-mapping>
- listener(监听器):主要用于监听 ServletContext、HttpSession 和 ServletRequest 等对象的生命周期和属性的变化,这些监听器可以用来处理 Web 应用程序中的各种事件,例如初始化、销毁、属性变化等。在spring框架中ContextLoaderListener监听器,启动tomcat时自动装配spring的配置。
- filter(过滤器):对请求和响应进行过滤,用于权限控制、编码设置、过滤敏感词汇等。(下面是spring框架内置的过滤器),如果自己写就实现javax.servlet.Filter接口就行,不用配置。
<filter> <filter-name>SpringCharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>SpringCharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
三、servlet程序的调用过程
- 根据请求行,定位虚拟主机、web应用和请求的资源
- 在web.xml配置文件中寻找对应的url处理的servlet,以及全路径
- tomcat会根据全路径利用反射创建servlet实例,并且执行service方法
Class.forName(“com.hhh.servlet”).newInstance():
- service方法使用request和response对象作为参数,进行数据的处理已经封装
- 返回浏览器符合http协议的响应对象
1.servlet是单例模式
每次进行访问请求时,都会查询内存中是否有servlet对象,如果没有就创建。当服务器关闭时servlet对象销毁。
2.每次请求的request和response对象都是新创建的
四、request对象
requst对象用于服务器获取浏览器提供的请求信息。
1.作用一:获取请求参数
请求参数就是浏览器向服务器发送请求时携带的参数,有请求体中的参数或在url拼接的参数。
request.getParameter(String ParamName);
注意编码问题
request.setCharacterEncoding("utf-8");
2.作用二:实现请求转发
什么叫请求转发???
请求转发就是访问资源a时,a资源没有做处理将请求转发给资源b,资源b对这个请求进行响应。
注意:请求转发浏览器的url不会变化;一次请求一次响应
请求转发必须在同一个web应用中进行;
请求转发的的url必须有servelt映射,否则404;
请求转发和域对象配合可以携带数据
request.getRequestDispatcher(String url).forward(req,res);
3.作用三:配合作用域对象实现带数据转发
什么是域对象???
域对象就是一个有访问范围、有map属性,通过自身的map在访问域内实现资源的共享。request对象就是一个域对象。
request提供的共享map数据的方法
request.setAttribute(String keyName, Object value);
//存储map数据
request.getAttribute(Sting keyName);
//获取某个key的value
步骤:
- 第一步:在处理请求的Servelet类中的doGet()方法中通过setAttribute()方法完成数据封装。并通过request.getRequestDispatcher(String url).forward(req,res);完成转发。
- 第二步:在数据目的地通过request.getAttibute()方法获取解析数据。
五、response对象
1.作用一:向浏览器返回数据
response.getWriter().write(data);
response.setContentType("utf-8");
//响应的编码方式
2.作用二:重定向
什么是重定向???
重定向就是请求资源a的时候,需要进一步请求资源b才能获取对应的资源。
重定向是两次请求两次响应。浏览器的url变化。
重定向两次请求的request对象不同
重定向两次请求的资源可以是不同的web应用、甚至可以是不同的服务器。
步骤
- 代码:response.sendRedirect("重定向资源的url");
- 关于重定向资源的url:
- 可以是同一web应用下的其它文件,如:fileName.fileType。
- 可以是同一虚拟主机的其它web应用的资源,如:/webAppName/[resourceDecName/]fileName.filetype。
- 可以是其它虚拟主机,如:http://www.baidu.com.