您的位置:首页 > 其它

关于Servlet中filter过滤器的小问题

2015-04-13 14:35 281 查看
刚进入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();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: