当前位置: 首页 > 面试题库 >

是否有建立网址的正确方法?

汤跃
2023-03-14
问题内容

在我使用的许多代码中,都有一些可怕的东西,例如:

String url = "../Somewhere/SomeServlet?method=AMethod&id="+object.getSomething()+ "&aParam="+object.getSomethingElse());

或者-更糟糕的是:

String url = "Somewhere/Here/Something.jsp?path="+aFile.toString().replace("\\","/")+ "&aParam="+object.getSomethingElse());

有正确的方法来:

  1. 创建一个新的URL(或者它是一个URI)。
  2. 向其添加正确的转义参数。
  3. 在这些参数中添加格式正确的文件路径。
  4. 将其解析为字符串。

从本质上讲,仅构建字符串比正确地构建字符串太容易了。有没有一种方法可以像构建字符串一样容易 地正确 完成呢?

添加

为了清楚起见-经过一番思考-我想我正在寻找类似的东西:

String s = new MyThing()
    .setPlace("Somewhere/Something.jsp")
    .addParameter(aName,aValue)
    .addParameter(aName,aFile)
    .toString();

这样就可以解决转义并添加“?” /“&”并将“ \”更改为“ /”而不是对文件使用“ \”等所有不愉快之处。

如果我必须自己写一个(即如果不是Apache的话),那么有真正的Java技术可以正确地转义各个部分。我的意思是将参数中的“”转义为“”。而在其他地方将“”转义为“%20”。


问题答案:

我已经写好了,您可以在需要附加功能的地方进行更改。它不使用任何外部资源,如果我看过东西,请告诉我!

它基本上是URI该类的包装器,使您可以更轻松地将子目录和参数添加到URI。如果您对某些内容不感兴趣,则可以设置默认值。

编辑:我添加了一个使用相对URI的选项(根据您的问题)。

public class Test {
    public static void main(String[] args) throws URISyntaxException,
            MalformedURLException {
        URLBuilder urlb = new URLBuilder("www.example.com");
        urlb.setConnectionType("http");
        urlb.addSubfolder("somesub");
        urlb.addSubfolder("anothersub");
        urlb.addParameter("param lol", "unknown");
        urlb.addParameter("paramY", "known");
        String url = urlb.getURL();
        System.out.println(url);


        urlb = new URLBuilder();
        urlb.addSubfolder("servlet");
        urlb.addSubfolder("jsp");
        urlb.addSubfolder("somesub");
        urlb.addSubfolder("anothersub");
        urlb.addParameter("param lol", "unknown");
        urlb.addParameter("paramY", "known");
        String relUrl = urlb.getRelativeURL();
        System.out.println(relUrl);
    }
}

class URLBuilder {
    private StringBuilder folders, params;
    private String connType, host;

    void setConnectionType(String conn) {
        connType = conn;
    }

    URLBuilder(){
        folders = new StringBuilder();
        params = new StringBuilder();
    }

    URLBuilder(String host) {
        this();
        this.host = host;
    }

    void addSubfolder(String folder) {
        folders.append("/");
        folders.append(folder);
    }

    void addParameter(String parameter, String value) {
        if(params.toString().length() > 0){params.append("&");}
        params.append(parameter);
        params.append("=");
        params.append(value);
    }

    String getURL() throws URISyntaxException, MalformedURLException {
        URI uri = new URI(connType, host, folders.toString(),
                params.toString(), null);
        return uri.toURL().toString();
    }

    String getRelativeURL() throws URISyntaxException, MalformedURLException{
        URI uri = new URI(null, null, folders.toString(), params.toString(), null);
        return uri.toString();
    }
}

输出:

绝对

http://www.example.com/somesub/anothersub?param%20lol=unknown¶mY=known

相对的

/ servlet / jsp / somesub / anothersub?param%20lol = unknown&paramY =已知



 类似资料:
  • 问题内容: 我有以下情况: 这些检查都没有成功。只有路径不同:u1的路径为“ /”,而u2的路径为“”。这些URL是否指向相同的资源,是否可以在不打开连接的情况下检查这种情况?我是否误解了有关URL的一些基本知识? 编辑 我应该指出,需要非黑客检查。说空路径== /是否合理?我希望没有这种代码 问题答案: 从2007 JavaOne中: 第二个难题的标题是“集的更多乐趣”,它使用户可以创建由多个U

  • 问题内容: 我正在用StringBuilder构建一个String 然后我建立一个网址 然后我尝试连接 但是从我得到的结果来看,URL似乎不正确。就像某些参数被错误地传递了一样。这就是为什么我认为问题出在StringBuilder中。 问题出在我尝试传递的双参数中。 然后我把它放在URL中。但是,如果我将其作为字符串给出,则结果是正确的。 是否需要UrlEncoding?我将尝试以下建议。 问题答

  • 我正在尝试构建一个通过Lettuce与redis通信的Denodo java存储过程。 我正在使用Denodo 4e eclipse extension和Denodo推荐的oxygen。 我显然遗漏了一些东西,因为所有的文档都表明 而且 抛出的错误被调试方法所掩盖,我所知道的是,在第一个实例中,构建器失败,在第二个实例中,客户端失败。 当我调用redis-cli时,我看到redis正在以127.0

  • 本文向大家介绍Delphi实现判断网址是否存在及是否可以打开的方法,包括了Delphi实现判断网址是否存在及是否可以打开的方法的使用技巧和注意事项,需要的朋友参考一下 本例所述Delphi程序用于检测网址是否为404,也就是检测网址是否存在,或是否可以打开,针对不同的检查方法,会返回不同的结果。 程序主要代码如下:

  • 问题内容: 我知道Flask具有int,float和path转换器,但是我们正在开发的应用程序的URL中具有更复杂的模式。 有没有办法像Django一样使用正则表达式? 问题答案: 即使Armin用可接受的答案击败了我,我仍然认为我会展示一个简短的示例,说明如何在Flask中实现正则表达式匹配器,以防万一有人想要如何完成此工作的示例。 该URL应返回200:http:// localhost:50

  • 我正在处理一个数据库,我用AutoCloseabe的extends创建了一个名为Dao的公共接口,所以我有一个实现这个接口的类,但我想在那里创建一些私有方法,但它们仍然需要Autocloseable。所以我的问题是,我不能在接口中创建私有方法而不在接口中定义它们。如果我在类中创建一个私有方法,但不从DAO重写,就会发生这种情况?他们不会有自动关闭的,是吗?。如果没有,我可以实现哪种解决方案?