回到url-pattern(从jsp页面调用servlet)

时间:2010-10-27 19:32:50

标签: html xml jsp

我在jsp中创建了一个小型web-app,其中包含一个带登录的起始页面和一些带有注销的受限页面,其中包括使用过滤器和servlet控制的所有内容。我开始制作它是因为我想学习如何使用过滤器和servlet,并认为我已经很好地成功了。
当我确保一切都发生在'root'url-pattern中时,一切正常,但问题是我希望受限制的页面位于自己的url-pattern目录中......

在我的受限制网页上,我已将(< @ include ...>)一个包含此表格的退出页面包含在内:

<form method=POST action=LC>
<table align="right">

 <tr>
  <td>Navn:</td>
  <td><b><%=login.getName() %></b></td>
 </tr>
 <tr>
  <td>Aktør:</td>
  <td><b><%= login.getAktoer() %></b></td>
 </tr>
 <tr>
  <td><input type="submit" value="Log ud"></td>
 </tr>
 <tr>
  <td></td>
  <td><b><%= login.getMeddelelse() %></b></td>
 </tr>
</table>
</form>

此页面上的提交将用户发送到一个控制servlet,它只清除一个LoginBean,在同一个bean上将boolean isLoggedin值设置为false,最后将sendRedirect'设置为我的起始页面。当所有页面都在“root”url-pattern目录中时,这很有效。

我的一个限制页面是Yellow.jsp。就像现在一样,它只是跟随servlet映射:

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

我想要的是:

<servlet-mapping>
    <servlet-name>ptYellow</servlet-name>
    <url-pattern>/RestrictedPages/YellowZone/Yellow.jsp</url-pattern>
  </servlet-mapping>

但是当我尝试像这样映射并尝试从Yellow.jsp页面注销时,它只是吐出404错误,因为它试图在'/ RestrictedPages / YellowZone /'中访问我的注销控制servlet目录。

它试图访问:
的http://本地主机:8080 / MyApp的/ RestrictedPages / YellowZone / LC
(LC是我的Logout Control servlet)
什么时候应该去:
的http://本地主机:8080 / MYAPP / LC

我希望以不同的url模式在许多不同的受限页面上包含我的注销,因此它不应该映射到相同的url模式(这似乎无法解决问题)。
我绝对不想在所有受限制的页面上硬编码注销表格,当我知道它应该可以“包含”它...

我猜我必须在我的注销表格动作属性中写一些特别的东西,但是无法弄清楚要写什么。我尝试过这样的东西:
行动= * / LC

动作= / .. / LC

从大多数不相关的代码中删除,我的xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0">
  <welcome-file-list>
    <welcome-file>StartSide.jsp</welcome-file>
  </welcome-file-list>
  <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>control.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <servlet-name>AC</servlet-name>
  </filter-mapping>
  <filter>
    <filter-name>YellowFilter</filter-name>
    <filter-class>control.YellowFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>YellowFilter</filter-name>
    <url-pattern>/RestrictedPages/YellowZone/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>ptYellow</servlet-name>
    <jsp-file>/Yellow.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>ptYellow</servlet-name>
    <url-pattern>/RestrictedPages/YellowZone/Yellow.jsp</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>start</servlet-name>
    <jsp-file>/StartSide.jsp</jsp-file>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>start</servlet-name>
    <url-pattern>/start</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>AC</servlet-name>
    <servlet-class>control.ActorControl</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AC</servlet-name>
    <url-pattern>/AC</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>LC</servlet-name>
    <servlet-class>control.LogoutControl</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LC</servlet-name>
    <url-pattern>/LC</url-pattern>
  </servlet-mapping>

</web-app>

如果有人可以指出我做错了什么会很棒...我可以看到在url-patterns上使用过滤器的很多潜力,但是当我不能做简单的东西时对我没用喜欢回到网址模式....
我正在使用Eclipse Helios和apache-tomcat 7.0,如果它有任何相关性......
(我用了几个小时试图寻找答案,但我认为我不确切知道要搜索的内容)

编辑:拼写错误和澄清

EDIT2:我试图在我的Logout.jsp页面上做一些映射(这是我在限制页面上包含的注销页面),但这似乎无法解决问题要么......

编辑3:今晚我已经解决了这个问题。 我尝试将这段代码添加到我的YellowFilter.java中(并将名称= Logout添加到Logout.jsp中的提交按钮):

try{
        if(httpReq.getParameter("logout").equals("Log ud"))
            httpResp.sendRedirect("LC");
        } catch(NullPointerException e)
        {
        }

它也没有用,它仍然只是试图访问
的http://本地主机:8080 / MyApp的/ RestrictedPages / YellowZone / LC 我还尝试从我的注销表单中删除action参数,因此它只会POST到同一页面。这也无济于事......

此外,我试图在xml文件中编辑我的Logout控制servlet的servlet-mapping:

<servlet-mapping>
    <servlet-name>LC</servlet-name>
    <url-pattern>/*/*/LC</url-pattern>
  </servlet-mapping>

没用,然后我尝试了:

<servlet-mapping>
    <servlet-name>LC</servlet-name>
    <url-pattern>/*/LC</url-pattern>
  </servlet-mapping>

也没用,所以我尝试了:

<servlet-mapping>
    <servlet-name>LC</servlet-name>
    <url-pattern>/*LC</url-pattern>
  </servlet-mapping>

这也不起作用......

/叹了口气,非常烦人的问题,并且不能放手......

1 个答案:

答案 0 :(得分:0)

我找到了一个非常简单的问题解决方案。我只是将Logout.jsp中的form方法更改为method = GET而不是POST,然后编写action = /'myappname'/'name-of-servlet':

<form method=GET action=/Prototype/LC>
<table align="right">

    <tr>
        <td>Navn:</td>
        <td><b><%=login.getName() %></b></td>
    </tr>
    <tr>
        <td>Aktør:</td>
        <td><b><%= login.getAktoer() %></b></td>
    </tr>
    <tr>
        <td><input type="submit" value="Log ud"></td>
    </tr>
    <tr>
        <td></td>
        <td><b><%= login.getMeddelelse() %></b></td>
    </tr>
</table>
</form>

现在这个解决方案对我来说非常明显了,我忽略了这一点,我真的希望别人有同样的问题xD ...
将我的问题标题改为'回到url-pattern(从jsp页面调用servlet)'