文章目录
一、 JavaWeb过滤器Filter
1.1过滤器介绍
1.2 需要的依赖
连接数据库需要的依赖
<!-- 链接数据库的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
1.3 编写过滤器
1.3.1 导入包继承接口
继承的接口:Filter
导入的包:javax.servlet.*
import javax.servlet.*;
import java.io.IOException;
/**
* @author fuyaling
* @create 2021-10-15-14:46
*/
public class FilterTest implements Filter {
}
1.3.2 重写方法:
- 初始化方法
init()
——web服务器一旦启动就会执行,等待过滤对象出现 - 过滤:
doFilter方法
:方法中的所有代码,在过滤特定请求的时候都会执行
必须让过滤器继续执行,否则程序会被拦停,即必须执行chain.doFilter()
方法 - 销毁方法
destory()
——web服务器关闭时会销毁过滤器
1.4 解决中文乱码
Servlet解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
Servlet解决乱码的话,需要写很多次上述代码
Filter解决乱码
ServletTest.java()
public class ServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//此处没有进行乱码处理,但是会通过过滤器处理
resp.getWriter().write("过滤器学习");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
过滤器中的doFilter()
/*
* 1、过滤器中的所有代码,在过滤特定请求的时候都会执行
* 2、必须要让过滤器继续执行(chain.doFilter())
* */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//处理乱码
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("Filter拦截乱码");
//chain
//这段程序的作用是让请求继续走,如果不写程序会在这里被拦截停止
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("程序继续执行");
}
在web.xml中配置过滤器和servlet
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>com.servlet.servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filter</filter-name>
<filter-class>com.servlet.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<!--只要是/servlet下的任何请求都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
访问页面
二、 Javaweb监听器Listener
2.1 实例化接口如HttpSessionListener
监听当前网站在线人数
public class ListenerTest implements HttpSessionListener {
//创建session监听
//一旦创建Session就会触发此事件
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("onlineCount");
if (onlineCount == null) {
onlineCount = new Integer(1);
} else {
int count = (int) onlineCount;
onlineCount = count+1;
}
context.setAttribute("onlineCount", onlineCount);
}
//销毁监听器
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("onlineCount");
if (onlineCount == null) {
onlineCount = 0;
}else {
int count = onlineCount.intValue();
onlineCount = count-1;
}
context.setAttribute("onlineCount",onlineCount);
}
}
2.2 注册监听器
<!--注册监听器-->
<listener>
<listener-class>com.servlet.listener.ListenerTest</listener-class>
</listener>
2.3 在jsp页面中显示
<body>
<h1>当前在线人数:<%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></h1>
</body>
2.4 Gui中的监听器
public class ListenerForGUI {
public static void main(String[] args) {
Frame frame1 = new Frame("frame1");
Panel panel = new Panel(null);//面板
frame1.setLayout(null);//窗体布局
frame1.setBounds(300,300,500,500);
frame1.setBackground(Color.BLUE);//
frame1.add(panel);
frame1.setVisible(true);
//监听事件
frame1.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}