日期:2014-05-18  浏览次数:20695 次

奇怪的servlet路径配置
以下是重要代码
\WebRoot\WEB-INF\jsp
\login.jsp  
验证码:<img name="d" src="authImg">

web.xml

<!-- 为图形验证码Servlet配置URL -->
<servlet-mapping>
<servlet-name>img</servlet-name>
<url-pattern>/WEB-INF/jsp/authImg.jsp</url-pattern>
</servlet-mapping>

servlet路径
E:\myeclipse\HRSystem\src\org\qjkt\hrsystem\web\AuthImg.java
红色为路径 我就奇怪了 为什么路径会是这个?

------解决方案--------------------
首先,告诉你一个小秘密:<url-partten>是可以随便乱写的,你爱怎么写就怎么写。它存在不存在是无所谓的,只要你写了,浏览器和服务器都会认为它是实际存在的。
第二,只要你写了,如果你要访问这个Servlet,那你就只能按照<url-partten>所写的去访问这个Servlet。
这就是所谓Servlet魔法,爽吧?

OK,你知道了这两个秘密,我们再来看你的问题。

\WebRoot\WEB-INF\jsp 
\login.jsp
验证码: <img name="d" src="authImg"> 

web.xml 

<!-- 为图形验证码Servlet配置URL --> 
<servlet-mapping> 
<servlet-name>img </servlet-name> 
<url-pattern>/WEB-INF/jsp/authImg.jsp </url-pattern> 
</servlet-mapping>

从你的代码中可以看出,你有一个叫login.jsp的文件,它放在WEB-INF\jsp下面?里面有一句代码,它要显示一个叫authImg的图片?这里要指出你的一个错误,我认为你把img的src写错了,应该是<img name="d" src="authImg.jsp"> 
其实这张图片是动态生成的,由一个叫authImg的Servlet来动态生成。

这个应该就是你的代码做的事情。

那么,我们来想想,为啥<url-pattern>要写成/WEB-INF/jsp/authImg.jsp呢?答案是,为了配合login.jsp的所在位置(WEB-INF/jsp),以便于在img标签中直接使用authImg.jsp这个名字来引用它。

那么,又来一个问题了:为什么要把这个Servlet的<url-pattern>写成/WEB-INF/jsp/authImg.jsp呢?答案是:为了让别人无法直接访问这个Servlet(WEB-INF文件夹下面的文件是无法使用浏览器直接访问的)。

接着的问题就是:你写一个/WEB-INF/jsp,Servlet就在/WEB-INF/jsp下面了?答案是:请参看前面我所说的第一个小秘密!

最后的问题是:那么请问这个URL是根据什么定义的呢? authImg authImg.JPG authImg.java行不?
答案是:这个URL是拍脑袋想出来的,爱怎么定义都行,authImg authImg.JPG authImg.java全部都可以。

你可以自己测试一下。
------解决方案--------------------
楼主没什么奇怪的,如果你看过jivesoftware公司的东西 就会清楚了,他们总是把jsp编译后打包,作为servet发布,url mapping时候 用原来的jsp名字作为映射地址目标。
例如:
<servlet>
<servlet-name>org.jivesoftware.openfire.admin.audit_002dpolicy_jsp</servlet-name>
<servlet-class>org.jivesoftware.openfire.admin.audit_002dpolicy_jsp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>org.jivesoftware.openfire.admin.audit_002dpolicy_jsp</servlet-name>
<url-pattern>/audit-policy.jsp</url-pattern>
</servlet-mapping>