您现在的位置是:主页 > news > 公司网站改版方案/培训机构退费纠纷一般怎么解决
公司网站改版方案/培训机构退费纠纷一般怎么解决
admin2025/4/29 23:13:19【news】
简介公司网站改版方案,培训机构退费纠纷一般怎么解决,做公司网站的公司,旅游网站的制作过滤器、监听器及Servlet3.0注解 一、过滤器 1.1流程 单个过滤器流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行后处理。 多个过滤器流程:Filter 对用户请求进行…
过滤器、监听器及Servlet3.0注解
一、过滤器
1.1流程
单个过滤器流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行后处理。
多个过滤器流程:Filter 对用户请求进行预处理接着交给下一个过滤器处理,过滤器处理完后将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行一系列 Filter 链的处理。
注:过滤器链:先配置先执行(请求时的执行顺序);响应时:以相反的顺序执行。
1.2 实现
1、新建普通java类
2、实现 javax.servlet.Fileter 接口
3、重写方法 ( init(), doFilter(), destroy() )
4、配置web.xml,并设置它所能拦截的资源。
过滤器:
public class Filter01 implements Filter {/*** 初始化,只执行一次 */@Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter01 init...."); }@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Filter01"); // 请求到达资源之前处理的代码 System.out.println("Filter01 请求到达资源之前处理的代码..."); // 放行 chain.doFilter(request, response); // 响应到客户端之前执行的代码 System.out.println("Filter01 响应到客户端之前执行的代码..."); }/*** 销毁,只执行一次 */ @Override public void destroy() {System.out.println("Filter01 destroy....");}
}
web.xml
<filter> <filter-name>filter01</filter-name><!-- 给服务器看的 --> <filter-class>com.mage.filter.Filter01</filter-class><!-- 设置资源路径 -->
</filter>
<filter-mapping><filter-name>filter01</filter-name><!-- 给服务器看的 --> <url-pattern>/s01</url-pattern><!-- 设置要拦截的路径 -->
</filter-mapping>
1.3 过滤器处理字符乱码
Filter代码
/*** GET:请求:Tomcat8及以上,不需要处理Tomcat7及以下,需要处理乱码new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");响应:response.setContentType("text/html;charset=UTF-8");POST:请求:Tomcat8及以上,需要处理乱码,request.setCharacterEncoding("UTF-8");Tomcat7及以下,需要处理乱码,request.setCharacterEncoding("UTF-8");响应:response.setContentType("text/html;charset=UTF-8");* @author Cushier**/
public class EncodeFilter implements Filter {@Overridepublic void init(FilterConfig fConfig) throws ServletException {}@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {// 基于HttpHttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)resp;// 设置POST请求编码以及响应编码request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");// 获取服务器版本String serverInfo = request.getServletContext().getServerInfo();// Apache Tomcat/8.0.52System.out.println(serverInfo);// 得到版本号 **左闭右开**String info = serverInfo.substring(serverInfo.indexOf("/")+1,serverInfo.indexOf("/")+2);// 判断Tomcat版本是否是7及以下if(info != null && Integer.parseInt(info) <= 7){// 判断请求方式if("get".equalsIgnoreCase(request.getMethod())){//是get请求//Tomcat7及以下,需要处理乱码//new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");//由于无法得到用户的参数,所以定义一个内部类MyWrapper,继承HttpServletRequestWrapper,重写getParameter方法//myWrapper其实就是重写了getParameter方法的request对象,而重写后的方法里解决了乱码问题,所以用户调用的时候不会乱码HttpServletRequest myWrapper = new MyWrapper(request);// 放行chain.doFilter(myWrapper, response);return;}}chain.doFilter(request, response);}@Override public void destroy() {}/*** 定义内部类MyWrapper继承HttpServletRequestWrapper* 目的:重写getParameter方法* @author Cushier**/class MyWrapper extends HttpServletRequestWrapper{HttpServletRequest request;public MyWrapper(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {String value = null;try {if(request.getParameter(name)!=null) {value = new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return value;}}
}
二、监听器
2.1 介绍:
web 监听器是一种 Servlet 中的特殊的类,它们能帮助开发者监听 web 中的特定事件,比如 ServletContext,HttpSession,ServletRequest 的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。例如可以用来统计在线人数等。
2.2 分类:
监听器有三类8种:
⑴ 监听生命周期(三个域对象的创建和销毁):实现接口 ServletRequestListener、
HttpSessionListener 、ServletContextListener
⑵ 监听值的变化(属性添加,移除,替换):实现接口 ServletRequestAttributeListener、
HttpSessionAttributeListener、ServletContextAttributeListener
⑶ 针对 session 中的对象:监听 session 中的 java 对象(javaBean),javaBean 直接实现监听器的
接口 HttpSessionBindingListener、HttpSessionActivationListener。
2.3 实现
1、新建普通java类
2、实现需求相应的接口
3、重写接口
4、配置web.xml
这里我们只做一个简单的演示。假设我们想做一个对在线人数的监控。
- 创建一个类,并实现 HttpSessionListener 接口,用来检测 Session 的创建和销毁。在类中定义一个成员变量用来存储当前的 session 个数。
public class Listener01 implements HttpSessionListener {static int onlinePeople = 0;/*** 监听SESSION创建*/@Overridepublic void sessionCreated(HttpSessionEvent se) {// 每次创建session对象时,人数+1onlinePeople ++;// 不同用户不同session,除非重新创建一个session才是最新的人数se.getSession().getServletContext().setAttribute("onlinePeople", onlinePeople);System.out.println("session创建了。。。");}/*** 监听SESSION销毁* 正常关闭服务器不会销毁,因为会自动序列化到本地*/@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// 每次销毁session对象时,人数-1onlinePeople --;se.getSession().getServletContext().setAttribute("onlinePeople", onlinePeople);System.out.println("session销毁了。。。");}
}
- 在 web.xml 中配置该监听器,让监听器生效
<listener><listener-class>com.mage.listener.Listener01</listener-class></listener>
- 做一个测试的 Servlet 用来访问,和显示当前在线人数
public class Servlet01 extends HttpServlet {private static final long serialVersionUID = 1L;protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("s01。。。");// 即是获取也是创建int onlinePeople = (int) request.getSession().getServletContext().getAttribute("onlinePeople");// 输出response.setContentType("text/html;charset=UTF-8");response.getWriter().write("<h1>在线人数</h1>" + onlinePeople);}
}
public class Servlet02 extends HttpServlet {private static final long serialVersionUID = 1L;protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getSession().invalidate();}
}
- 用不同浏览器进行创建,模拟多人在线。
三、Servlet3.0注解
在 Servlet3.0 之前一直使用的都是配置文件的方式来实现各种组件,Servlet3.0 之后提供了注解,可以达到零配置。但现实中一般是注解+配置结合使用。我们看几个常用的注解。
3.1 @WebServlet
@WebServlet用注解配置 Servlet ,写在类的上方第一行,相当于在web.xml中配置。
下方都可以通过/s01路径访问。详细的属性介绍可以按ctrl+点击代码中的WebServlet ,查看其源码
@WebServlet("/s01")
@WebServlet(name = "servlet01",value = "/s01")
@WebServlet(value="/s01")
也可以配置多个 urlPatterns 来指定多个访问路径,路径用逗号隔开
@WebServlet(name = "servlet01",urlPatterns = {"/s01","/s001"})
3.2 @WebFilter
@WebFilter 用来配置过滤器
指定路径进行过滤
@WebFilter("/s001")
所有路径都过滤
@WebFilter(filterName = "filter01",urlPatterns = "/*")
注:使用注解时,过滤器链按照类名的字母排序(大部分情况)
3.3 @WebListener
@WebListener 注解将一个实现了特定监听器接口的类定义为监听器。比如将实现了 ServletSessionListener 接口的类标注为监听器。
@WebListener
public class Listener02 implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) {}public void sessionDestroyed(HttpSessionEvent se) {}
}
3.4 @MultipartConfifig
使用注解 @MultipartConfifig 将一个 Servlet 标识为支持文件上传。Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作。
上传文件三注意:
前台
1.请求方式post
2.enctype=“multipart/form-data”后台
3.一定要加上注解 @MultipartConfig
前台
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body><form action="upload" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="uname"/> 文件:<input type="file" name="myfile"/> <input type="submit" value="上传" /> </form> </body>
</html>
后台
主要步骤:
-
1、得到Part文件对象,request.getPart(String name); name对应前台文件输入框的name属性的值
-
2、得到文件上传真实路径 path
-
3、输出文件 part.write(path)
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L;protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("上传文件...");// 设置编码request.setCharacterEncoding("UTF-8"); // 获取普通表单项参数 String uname = request.getParameter("uname"); System.out.println(uname);// 上传文件 // 得到part对象 request.getpart(name):name代表的是表单中file元素的name属性值 Part part = request.getPart("myfile"); // 得到文件存放的路径String path = request.getServletContext().getRealPath("/"); // 得到文件名String fileName = part.getSubmittedFileName();// 上传part.write(path + fileName); }
}