刚进入filter的学习,一开始认为这东西也就不过如此了。
但是,我必须得承认,我错了!
刚开始学的时候,老师让我们自己做一个小程序。
就是:输入一串字符,点击发送,在另一个窗口显示。要求是把字符串中的 ‘a‘ 字符转换成 ‘*‘ 输出、例子:“string”——》"*tring"。
我一想,很简单嘛。过一会就写出来了。
但是,就在运行的时候,出了问题。输入一串字符,他并没有立刻转换出来。要后退,再进入才能转换。这就是说,我这一次输入"string"它并不会立刻转换。我需要后退一步,在进入,才会转换成"*tring"。
问题很简单。就是在用户输入后,要跳转到另一个页面。过程是:1. 进入"web.xml"这个文件,其中有filter过滤器。2. 进入过滤器,查找是否有值,(答案是没有的因为这个时候我并没有将用户输入的值写入到session或者application中。)有值的话判断值中是否包含‘a‘,有则替换为‘*‘。3. 然后进入显示值处理的Servlet类,这里将用户数据处理,并存入session或者application中。4. 然后再跳转到显示页面。
从这个流程就可以看出问题了。第二步,没有值,所以没办法进行过滤。但是当循环一次后,到第二步这里,它就有值了,过滤器生效了。但是,这里过滤的字符串是上一次输入的。
所以我们需要在第二步的时候将用户输入的值取到。因此我尝试了使用request方法,将用户输入的值取出。
我在之前认为这是行不通的,因为request传值只能在下一个页面进行接收,但是,没想到在filter中也能通过new出request对象的方式进行操作。
下面上代码:
Filter
package servlet; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class T implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain nextPage ) throws IOException, ServletException { /* 取得所需要的内置对象*/ // request HttpServletRequest request = (HttpServletRequest)req; // session HttpSession session = request.getSession(); /** * 尝试直接拿到用户输入的值 */ String yh = req.getParameter("ping"); String a = null; if(yh!=null){ if(yh.indexOf(‘a‘)>=0){ a = yh.replace(‘a‘, ‘*‘); } } session.setAttribute("a", a); nextPage.doFilter(req, resp); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
Servlet
package servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.websocket.Session; public class P extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp){ this.doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp){ try { HttpSession session = req.getSession(); session.getAttribute("a"); req.getRequestDispatcher("/page/3.jsp").forward(req, resp); } catch (ServletException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
时间: 2024-10-13 18:11:10