【问题标题】:display html pages from WEB-INF in java在java中显示来自WEB-INF的html页面
【发布时间】:2015-05-07 14:29:02
【问题描述】:

我是 java web 的初学者。我正在尝试解决这个问题,但它不起作用。请给我一个完整的解决方案。我需要添加或更改以从 WEB-INF 显示 html 页面(在本例中为 search.html)。

这是我的 servlet 代码和 login.js

@WebServlet("/dispatcher")

公共类 DispatcherServlet 扩展 HttpServlet {

private static final long serialVersionUID = 1L;

@SuppressWarnings("unchecked")
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    resp.setContentType("application/json");
    String action = req.getParameter("action");

    try{
    switch(action){
    case "login": 
        AuthenticationActionsHandler authentication = new AuthenticationActionsHandler();
        sendResponse(resp, authentication.logIn(req) );
    break;
    case "registration":
        authentication = new AuthenticationActionsHandler();
        sendResponse(resp, authentication.registration(req) );
    break;
    case "getName": 
        if((Integer) req.getSession().getAttribute("Id") != null){
            UserActionsHandler user = new UserActionsHandler();
            sendResponse(resp, user.getName(req) );
        }
    break;
    case "logOut":
        authentication = new AuthenticationActionsHandler();
        sendResponse(resp, authentication.logOut(req) );            
    break;
    case "search": 
        ActionsHandler searchAction = new ActionsHandler();
        sendResponse(resp, searchAction.search(req) );
    break;
    case "saveRequest":
        ActionsHandler saveRequestAction = new ActionsHandler();
        sendResponse(resp, saveRequestAction.saveRequest(req) );
    break;
    case "showRequestedBooks":
        HttpSession session = req.getSession(true);
        Integer userId = (Integer)session.getAttribute("Id");
        if(userId == null){
            JSONObject result = new JSONObject();
            result.put("authentication", false);
            sendResponse(resp, result);
        } else{
            ActionsHandler showRequestedBooks = new ActionsHandler();
            sendResponse(resp, showRequestedBooks.showRequestedItems(req) );
        }
    break;

    }
}catch(MissingParameterException e){
        sendErrorResponse(resp, e.getMissingParams());
}
}

public void sendResponse(HttpServletResponse resp, JSONArray resultJson ){
    PrintWriter out;
    try {
        out = resp.getWriter();
        out.println(resultJson);
    } catch (IOException e) {
        e.printStackTrace();
    }
}





$("#login").click(function(){
var hashPassword = hex_md5($("#password").val());
var requestData = {
        username: $('#username').val(),
        password: hashPassword,
        action: "login",
};
$.ajax({
    type : "POST",
    url : "/Library/dispatcher",
    data : requestData,
 }).done(
         function(responseData){
             if(responseData.error){
                 console.log(responseData.error);
                 $('#unsuccess').show();
             }
             else{
                 if(responseData.success){
                    // window.location.href = "/Library/search.html";
                     window.location.href = "/WEB-INF/search.html";
                 }
                 else{
                     $('#unsuccess').show();
                 }
             }
        });
});

【问题讨论】:

  • 你不应该把 html 文件放在 web-inf 中。您的 html 和 js 文件应位于您的 WebContent 文件夹或其子文件夹之一中。 web-inf 对客户端是隐藏的,只有服务器端可以看到。
  • WEB-INF 是 WebContent 的子文件夹 ;D
  • @YosefY 此文件夹可以隐藏,但取决于服务器配置。
  • WEB-INF 是 java web 服务器的内部文件夹。它默认是隐藏的,所以当我写“WebContent 文件夹或其子文件夹之一”时,我认为 WEB-INF 已排除... :)

标签: java html


【解决方案1】:

尝试添加 SearchServlet

@WebServlet("/search")
public class SearchServlet extends HttpServlet {
   protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException{

        request.getRequestDispatcher("/WEB-INF/search.html").forward(request, response);
   }
}

在您的 DispatcherServlet 中,如果登录成功,则通过调用 response.sendRedirect("/search") 将用户重定向到搜索 servlet

【讨论】:

  • 亲爱的 thoitbk 我已经向我的 dispatcherServlet 添加了一个新的 servlet 和 response.sendRedirect("/search"),但它不起作用。我是否应该更改我的 js 代码,因为在按下登录按钮后我无法引用 search.html 页面(似乎 window.location.href = "/WEB-INF/search.html"; 不起作用)。
  • 试试window.location.href = "/search"
【解决方案2】:

相反,我们可以将 JSP 和 HTML 文件放在与 WEB-INF 平行的单独文件夹中...WEB-INF 是私有文件夹.. 如果我没记错的话...Servlet 也放置在 WEB-INF\classes 中他们需要编译每次修改,因为 JSp 和 HTML 文件修改被容器自动识别

【讨论】:

  • 亲爱的公爵感谢您的回复。我在 WEB-INF 中替换了 search.html,因为我想阻止直接访问这个页面。首先用户必须进入登录页面并通过它到达搜索页面。
【解决方案3】:

将扩展名更改为 jsp,将其移动到 WebContent 并在开头添加用户已登录的验证(您可以在 HttpSession 中添加一些内容)。如果不将他重定向到登录页面...

【讨论】:

    【解决方案4】:

    这是not possible by specification page 70

    WEB-INF 节点不是公众的一部分 应用程序的文档树。 WEB-INF 目录中不包含任何文件 由容器直接提供给客户端。

    通过 servlet-3.0 可以在 WEB-INF/classes/resources/ 中提供文件,但我认为这是不好的做法。

    对不起

    【讨论】:

      【解决方案5】:

      根据您的评论,您希望首先将用户重定向到登录页面。为此,我们可以选择该 html 文件作为 web.xml(部署描述符)中的欢迎文件

      见下文

      <welcome-file-list>
      <welcome-file>login.html</welcome-file>
      </welcome-file-list>
      

      身份验证正确后,我们应该使用 sendRedirect 允许它们进入 search.html 文件。

      【讨论】:

        猜你喜欢
        • 2015-07-14
        • 1970-01-01
        • 2023-03-24
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 2020-12-13
        • 1970-01-01
        相关资源
        最近更新 更多