过滤器:通过对request,response的修改实现特定的功能,如请求数字字符编码,IP地址过滤,异类过滤,用户身份认证等。
监听器:用于监听Web程序中正在执行的程序,根据发生的事件做出特定的响应。
在编写完一个Servlet类后,需要在Web.xml中或者通过注解进行相关的配置,Web容器才能读取Servlet设置的信息,包括其类地址,初始化。对于每个Servlet的配置,Web都生成与之对应的ServletConfig对象,从ServletConfig中可以得到Servelt初始化的参数。在调用init()方法,将产生的ServletConfig作为参数传入Servelt中
GenericServlet类同时实现了Servlet,ServletConfig两个接口。
方法 | 描述 |
---|---|
getServletName() | 改方法返回一个Servlet实例的名称 |
getServletContext() | 返回一个ServletContext对象的引用 |
getInitParameter(String name) | 返回一个由参数name决定的初始化变量值 若不存在则返回null |
getInitParameterNames() | 返回一个存储初始化变量的枚举值。若初始化变量则返回一个空枚举类型 |
在Web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<display-name>ss</display-name>
<servlet-name>ServletConfig</servlet-name><!--Servlet名称-->
<servlet-class>until7ServletConfig.test</servlet-class><!--类路径-->
<load-on-startup>-1</load-on-startup>//设置优先级
<init-param>
<param-name>success</param-name>//配置初始化值实现跳转
<param-value>success.html</param-value>
</init-param>
<init-param>
<param-name>error</param-name>//配置初始化值实现跳转
<param-value>error.html</param-value>
</init-param>
<init-param>
<param-name>use</param-name>//配置初始化值
<param-value>xing</param-value>
</init-param>
<init-param>
<param-name>pass</param-name>//配置初始化值
<param-value>1234</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfig</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
ServletConfig方法实现
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
ServletConfig config = getServletConfig();//获取ServletConfig对象
String success = config.getInitParameter("success");
String error = config.getInitParameter("error");
System.out.println("success......"+success);
System.out.println("error......"+error);
Enumeration enumeration = config.getInitParameterNames();//枚举类型
while (enumeration.hasMoreElements()){
String name = (String)enumeration.nextElement();//至少话有一个可提供元素返回下一个
String value = config.getInitParameter(name);
System.out.println("name......"+name);
System.out.println("value....."+value);
}
ServletContext servletContext = config.getServletContext();//获取上下文
System.out.println("ServletContext......"+servletContext);
String servletName = config.getServletName();
System.out.println("servletName....."+servletName);
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//String use = request.getParameter("use");
//String pass = request.getParameter("pass");
String use = config.getInitParameter("use");
String pass = config.getInitParameter("pass");//通过ServletConfig对象获取Servlet类初始化时的参数
if(use!=null&&"a".equals(use)&&pass!=null&&"1234".equals(pass)){
HttpSession session = request.getSession();
session.setAttribute("use",use);
RequestDispatcher dispatcher = request.getRequestDispatcher(success);//判断实现跳转
dispatcher.forward(request,response);
}else{
RequestDispatcher dispatcher = request.getRequestDispatcher(error);//判断实现跳转
dispatcher.forward(request,response);
}
}
使用ServletContext对象是Servlet中全局存储信息,获取请求资源的URL设置,Web应用程序初始化参数。
当服务器启动web容器为web应用创建唯一的ServletContext对象,应用Servlet共享一个ServletContext对象。ServletContext存放共享信息。属于Web应用被各个Servlet共享。
方法 | 描述 |
---|---|
getRealPath(String path) | 获取给定的虚拟路径所对应的真实路径名 |
getResource(String uripath) | 返回由path指定的资源路径对应的一个URL对象 |
getResourceAsStream(String uripath) | 返回一个指定位置资源的InputStream,返回InputStream可以任意类型和长度 |
getRequestDispatcher(String uripath) | 返回一个特定URL的RequestDispatcher对象,否则返回一个空值 |
getResourcePaths(String path) | 返回一个存储web-app中指定资源路径的set集合,若一个目录信息,会以“/”作为结尾 |
getServletInfo | 获取服务器的名字和版本号 |
web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<display-name>ss</display-name>
<servlet-name>ServletContext</servlet-name><!--Servlet名称-->
<servlet-class>until7ServletContext.test</servlet-class><!--类路径-->
<load-on-startup>-1</load-on-startup>
<init-param>
<param-name>dir</param-name>
<param-value>/dir</param-value>
</init-param>
<init-param>
<param-name>success</param-name>
<param-value>success.html</param-value>
</init-param>
<init-param>
<param-name>resource</param-name>
<param-value>/dir/test1.txt</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
ServletContext的用法
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
request.setCharacterEncoding("utf-8");
String dir = getInitParameter("dir");
String success = getInitParameter("success");
String resource = getInitParameter("resource");
ServletContext context =getServletContext();//获取ServletContext对象
String path = context.getRealPath(success);//获取真实路径
System.out.println("path:真实路径......."+path);
Set set = context.getResourcePaths(dir);//获取指定路径的内容
for (Object str:set){//遍历set
System.out.println("文件...."+(String)str);
}
String serverinfo = context.getServerInfo();//获取服务器版本号
System.out.println("获取到服务器的版本号为..."+serverinfo);
InputStream in = context.getResourceAsStream(resource);
ServletOutputStream ou = response.getOutputStream();//输出二进制字符下载文件
byte[] b = new byte[1024];
//int len = -1;
while ((in.read(b))!=-1){
ou.write(b);
}
String str = new String(b);//转化为String形式
System.out.println(str);//在后台输出页面内容
in.close();
ou.close();
response.setContentType("text/html;charset = utf-8");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println("ServletContext ");
out.println("");
out.println(str);//获取到文件的内容在页面输出
out.println("");
out.println("");
out.close();
}