我的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 手册中的说明进行操作。