从页面名称中删除.jsp



我的Web应用程序中有一些jsp页面,我的web.xml中有以下代码(对于每个jsp页面):

<servlet>
    <servlet-name>login</servlet-name>
    <jsp-file>/login.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

此设置会从我的页面网址中删除.jsp,我可以打开/login,例如/login.jsp

实际上,此设置使我的jsp页面就像一个编译的servlet。

无论如何,是否可以为我的所有jsp页面执行此操作,而无需为每个页面编写此设置?我需要某种网址重写。

你需要创建一个通用的过滤器并处理请求并转发到相应的 jsps我有带有注释的写法器.xml如果您使用的是旧版本的 servlets则可以在 web 内编写。 公共过滤器 com.filters.CommonFilter

<filter-mapping>
    <filter-name>CommonFilter</filter-name>
    <url-pattern>*.*</url-pattern>
</filter-mapping>

在这里,所有请求都被转发到指定的 jsp。例如。如果 url 是/login ,它将被转发到/login.jsp ,或者如果是/home 然后转发到/home.jsp ...所有 url 都只被视为 jsp 文件,但您可以根据需要过滤 url

package com.filters;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter("*")  // give your url mapping  eg..//you can write for "/yoururlspec/*"
public class CommonFilter implements Filter {
    @Override
    public void init(FilterConfig config) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String path="";
        if (request.getRequestURI().length() > request.getContextPath().length())
        {path=request.getRequestURI().substring(request.getContextPath().length()+1, request.getRequestURI().length());
        req.getRequestDispatcher(path+".jsp").forward(req, res);
        }
    }
    @Override
    public void destroy() {
    }
}

这是对我来说工作正常的代码:

package filters;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashSet;
@WebFilter("*")
public class URLFilter implements Filter {
    HashSet<String> invalidExts = new HashSet<String>();
    @Override
    public void init(FilterConfig config) throws ServletException {
        invalidExts.add(".css");
        invalidExts.add(".js");
        invalidExts.add(".img");
        invalidExts.add(".png");
        invalidExts.add(".jpg");
        invalidExts.add(".jpeg");
        invalidExts.add(".gif");
        invalidExts.add(".woff");
        invalidExts.add(".woff2");
        invalidExts.add(".ttf");
        invalidExts.add(".eot");
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String context = request.getContextPath();
        String uri = request.getRequestURI();
        String qStr = request.getQueryString();
        if (!uri.endsWith("/") && uri.length() > context.length() && isPage(uri)) {
            if (uri.endsWith(".jsp")) {
                String path = uri.substring(0, uri.lastIndexOf(".jsp"));
                if (qStr != null && qStr.length() > 0)
                    path += "?" + qStr;
                response.sendRedirect(path);
            } else {
                String path = uri.substring(context.length()).replace("-", "_");
                req.getRequestDispatcher(path + ".jsp").forward(req, res);
            }
        } else chain.doFilter(req, res);
    }
    @Override
    public void destroy() {
    }
    private boolean isPage(String uri) {
        boolean result = true;
        String ext = null;
        if (uri != null) {
            if (uri.contains("."))
                ext = uri.substring(uri.lastIndexOf("."));
            if (ext != null && invalidExts.contains(ext))
                result = false;
        }
        return result;
    }
}

你可以试试 UrlRewriteFilter。

按照 UrlRewriteFilte 手册中的说明进行操作。

最新更新