我正在设计一个简单的基于Web的应用程序.我是这个基于Web的域的新手.我需要您对设计模式的建议,例如如何在Servlet中分配责任,制作新Servlet的标准等.
实际上,我的主页上有很少的实体,并且每个实体都对应于我们添加,编辑和删除等几个选项.之前我每个选项使用一个Servlet,比如Servlet1,用于添加entity1,Servlet2用于编辑entity1等等,这样我们最终得到了大量的servlet.
现在我们正在改变我们的设计.我的问题是你如何选择如何选择servlet的责任.我们是否应该为每个实体安装一个Servlet,它将处理所有选项并将请求转发给服务层.或者我们应该为整个页面都有一个servlet来处理整个页面请求,然后将其转发到相应的服务层?此外,请求对象是否应转发到服务层.
我有一个HttpServletRequest对象.
如何获得导致此调用的完整且准确的URL到达我的servlet?
或者至少尽可能准确,因为可能存在可以重新生成的东西(可能是参数的顺序).
方法request.getRequestURI()返回带有上下文路径的URI.
例如,如果一个应用程序的基本网址http://localhost:8080/myapp/(即上下文路径是MYAPP),和我打电话request.getRequestURI()了http://localhost:8080/myapp/secure/users,它将返回/myapp/secure/users.
有没有办法我们只能得到这个部分/secure/users,即没有上下文路径的URI?
让我们假设我有像'=&?/;#+%'这样的字符串作为我网址的一部分,让我们这样说:
example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf
Run Code Online (Sandbox Code Playgroud)
其中myString是上面的字符串.我编写了关键部分,因此URL看起来像
example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
当我在servlet中并且我读取任何一个request.getRequestURI(),request.getRequestURL()或者request.getPathInfo(),返回的值已经被解码,所以我得到了类似的strilng
someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf
Run Code Online (Sandbox Code Playgroud)
我无法区分真正的特殊字符和编码字符.
我通过完全禁止上面的字符解决了特殊的问题,这在这种情况下工作,但我仍然想知道有没有办法在servlet类中获取未解码的URL.
另一个编辑:当我昨晚遇到这个问题时,我太累了,无法注意到真正发生的事情,这更奇怪!我有servlet映射,比如说/ servletPath/*之后我可以放任何我想要的东西并让我的servlet响应路径的其余部分,除非路径中有%2F.在那种情况下,请求永远不会访问servlet,我得到404!如果我把'/'代替%2F它可以正常工作.我在Linux上运行Java 1.6.0-04上的Tomcat 6.0.14.
我需要设置Servlet(由于某些原因,只有servlet而不是处理程序)来处理war之外的文件.在这里/sf/answers/2011458501/我找到了以下解决方案:
Server server = new Server(8080);
ServletContextHandler ctx = new ServletContextHandler();
ctx.setContextPath("/");
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/webapp/");
ctx.addServlet(holderPwd, "/*");//LINE N
ctx.addServlet(InfoServiceSocketServlet.class, "/info");
server.setHandler(ctx);
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效,这就是我需要的.但是,一旦我将LINE N更改为,它就会停止工作ctx.addServlet(holderPwd, "/foo/*");.我试过"/ foo /","/ foo",但结果是一样的 - 我明白了not found.为什么?如何使其适应这种特定的背景?由于同样的原因,我使用jetty 9.2.15.
我发送以下http请求:
http://localhost:8081/member/createCompany/getSmallThumbnail/
Run Code Online (Sandbox Code Playgroud)
在服务器端,我遇到了控制器方法:
@RequestMapping("/error")
public String error(Model model, HttpServletRequest request){
if(request.getRequestURI().contains("thumbnail")){
System.out.println("thumbnail accepted");
}
request.toString();
model.addAttribute("message", "page not found");
return "errorPage";
}
Run Code Online (Sandbox Code Playgroud)
在这种方法下,我想知道请求到达的URL。
但是我无法在请求中找到将返回此方法的方法。
请帮助返回我想要的网址。
实际上我没有在Spring MVC应用程序中映射控制器(URL损坏)http://localhost:8081/member/createCompany/getSmallThumbnail/。此url(“ / error”)在web.xml中配置为错误页面。
我正在使用servlet从前端获取请求。我能否制作一个可以基于url模式执行多个操作的servlet?这是我的网址映射
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
<url-pattern>/HelloServletOne</url-pattern>
<url-pattern>/HelloServletTwo</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
这意味着,如果我按如下所示访问URL,则应调用其自身的功能。
我如何通过扩展servlet实现这一点?
代码/链接示例非常受赞赏。