- Servlet
Servlet组件是JavaEE进行web开发的最基本组件,可以处理请求写出响应,tomcat启动以后监听8080端口,解析web.xml文件,获取每个servlet以及对应的请求url,当tomcat接受到请求的时候,就可以根据请求的url信息,找到对应的servlet,然后通过反射创建这个servlet对象,再执行init方法,在调用servlet的service方法。当然也可以通过标签让服务器启动时就创建servlet对象,并执行init方法。
- web.xml中配置servlet
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.web.servlet.MyServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>www.cq.com</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/ser01</url-pattern>
</servlet-mapping>
- servlet代码
public class MyServlet extends HttpServlet {
public MyServlet(){
System.out.println("构造方法执行了");
}
@Override
public void init() throws ServletException {
System.out.println("初始化方法执行了");
ServletConfig servletConfig = getServletConfig();
System.out.println("当前servlet的name是" + servletConfig.getServletName());
System.out.println("当前servlet的初始化参数url是" + servletConfig.getInitParameter("url"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet接受到了请求");
}
}
我们可以看到mySevlet在服务器启动时被创建了,还执行了init方法,获取到了参数。
-
这里注意,servlet在响应的时候有两个响应流,一个是resp.getWriter(),一个是resp.getOutputStream(),这两个流前者专门写字符串,后者可以写任意类型数据包括二进制,但调用了其中任何一个就不能再调用另一个了。在文件下载的时候,通常使用OutputStream(),然后设置响应头 Content-Disposition ; attachment;filename=xxx.xxx,来告诉浏览器进行下载,如果filename有中心,还需要使用URLEncoder进行编码。
-
Filter
Filter为过滤器组件,在执行Servlet之前执行,可以在Filter中进行日志输出,权限校验等。多个Filter会组成FilterChian,也就是在调用chain.doFilter(res,resp)方法时,会传给下一个过滤器(如果有),如果没有则,会访问servlet。servlet访问完之后,就会执行chan.doFilter之后的代码,也就是整个过程是在一个线程执行的。
同时,filter的init方法,也可以获取filtername以及初始化参数init-param
自定义一个过滤器来模拟解决响应编码问题
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.web.filter.MyFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>responseEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class MyFilter implements Filter {
private String requestEncoding;
private String responseEncoding;
public MyFilter(){
System.out.println("filter构造方法执行了");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filterinit方法执行了");
System.out.println("当前filtername是" + filterConfig.getFilterName());
System.out.println("当前filter初始化参数设置的请求编码是" + filterConfig.getInitParameter("requestEncoding"));
System.out.println("当前filter初始化参数设置的响应编码是" + filterConfig.getInitParameter("responseEncoding"));
this.requestEncoding = filterConfig.getInitParameter("requestEncoding");
this.responseEncoding = filterConfig.getInitParameter("responseEncoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter执行前置代码");
servletRequest.setCharacterEncoding(this.requestEncoding);
servletResponse.setCharacterEncoding(this.responseEncoding);
servletResponse.setContentType("text/plain;charset=" + this.responseEncoding);
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("filter执行后置代码");
}
@Override
public void destroy() {
System.out.println("filter被销毁了");
}
}
在服务器启动时filter就会创建
拦截请求
- Listener
三大组件之一的Listener是在服务器启动时,执行监听器的回调方法,对服务器做一个初始化操作,并且listener中还可以获取ServletContxext对象,ServletContxext一个web工程只有一个,随着服务器的启动而创建,随着服务器的停止而销毁。监听器最典型的应用就是当我们和spring集成的时候配置的spring的监听器,spring的监听器就会得到ServletContext对象,拿到这个对象以后就可以拿到在中指定contextConfigLocation值,获取到配置文件以后,spring就可以执行new ClassPathXML…,这样解析好spring的配置文件以后,就可以创建好项目中的bean并自动装配好。
1.web.xml配置监听器以及ServletContext的初始化参数
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.properties</param-value>
</context-param>
<listener>
<listener-class>com.web.listener.ContextloadListener</listener-class>
</listener>
- listener伪代码
public class ContextloadListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext servletContext = event.getServletContext();
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
InputStream resourceAsStream = this.getClass().getClassLoader().
getResourceAsStream("spring.properties");
byte[] bytes = new byte[10240];
int read = 0;
try {
read = resourceAsStream.read(bytes);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("---------------"+new String(bytes,0,read));
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
监听器的contextDestroyed当服务器停止时调用。