2008-09-02 19 views
38

Tôi có một ứng dụng web dựa trên struts và tôi muốn trang "chào mừng" mặc định là một hành động. Các giải pháp duy nhất tôi đã tìm thấy để điều này dường như là biến thể trên làm cho trang chào đón một JSP có chứa một chuyển hướng đến hành động. Ví dụ, trong web.xml:Làm cách nào để đặt trang chào mừng thành hành động thanh chống?

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 

và trong index.jsp:

<% 
    response.sendRedirect("/myproject/MyAction.action"); 
%> 

Chắc chắn có một cách tốt hơn!

Trả lời

1

tôi sẽ tạo ra một bộ lọc và trả lại tất cả các yêu cầu để nhổ tận gốc trở lại với phản ứng về phía trước. Hacks với việc tạo trang home.do trông xấu xí với tôi (Một điều nữa cần nhớ cho bạn và điều tra cho ai đó sẽ hỗ trợ mã của bạn).

6

"Chắc chắn có một cách tốt hơn!"

Không có. thông số kỹ thuật Servlet (Java Servlet Specification 2.4, "SRV.9.10 Chào mừng Files" chẳng hạn) nhà nước:

Mục đích của cơ chế này là cho phép các Deployer để xác định một lệnh danh sách các URI một phần cho các container để sử dụng để thêm vào URI khi có yêu cầu cho URI tương ứng với mục nhập thư mục trong WAR không được ánh xạ tới thành phần Web.

Bạn không thể ánh xạ Struts trên '/', vì Struts loại yêu cầu làm việc với phần mở rộng tệp. Vì vậy, bạn còn lại để sử dụng một thành phần được ánh xạ ngầm định, chẳng hạn như tệp JSP hoặc tệp tĩnh. Tất cả các giải pháp khác chỉ là hack. Vì vậy, giữ cho giải pháp của bạn, nó hoàn toàn có thể đọc được và duy trì, không bận tâm tìm kiếm thêm.

+0

này là không chính xác. Bạn có thể ánh xạ các phần mở rộng cụ thể tới servlet mặc định (nội dung tĩnh) và bất cứ thứ gì/mọi thứ khác bất kể phần mở rộng của servlet hành động Struts. – guymac

+0

Nếu tôi nhớ chính xác (cách đây 6 năm), trong Struts 1 bạn được yêu cầu phải có URL hành động của bạn có phần mở rộng cụ thể, vì đây là cách ánh xạ được thực hiện (URL -> strip extension -> resolve module - > Hành động). Tất nhiên điều đó không áp dụng cho WebWork aka "Struts 2". –

+0

Dù sao, có lẽ đó là một câu hỏi WebWork và không phải là một câu hỏi Struts sau khi tất cả :-) –

22

Cá nhân, tôi sẽ giữ cùng một thiết lập bạn có ngay bây giờ, nhưng thay đổi chuyển hướng để chuyển tiếp. Điều đó tránh gửi một tiêu đề lại cho khách hàng và yêu cầu họ thực hiện một yêu cầu khác.

Vì vậy, đặc biệt, tôi muốn thay thế

<% 
    response.sendRedirect("/myproject/MyAction.action"); 
%> 

trong index.jsp với

<jsp:forward page="/MyAction.action" /> 

Hiệu quả khác của sự thay đổi này là người dùng sẽ không thấy URL trong thanh địa chỉ thay đổi từ "http://server/myproject" thành "http://server/myproject/index.jsp", khi chuyển tiếp xảy ra trong nội bộ trên máy chủ.

+0

Điều này cũng sẽ làm việc nếu ứng dụng của bạn triển khai trên đường dẫn không ROOT. Chuyển hướng ở trên sẽ hoạt động nếu bạn bỏ dấu "/" đầu tiên. –

+4

chuyển tiếp không hoạt động đối với tôi trong khi sendRedirect không hoạt động. Got '404 Not Found'. – Haozhun

+1

Rõ ràng điều này sẽ không hoạt động nếu bạn không chỉ định URL đầy đủ (bao gồm tên miền, v.v.), nhưng cách tiếp cận của @mrowe đã làm việc cho chúng tôi! – cprcrack

11

Kể từ phiên bản 2.4 của đặc tả Servlet, bạn được phép có một servlet trong danh sách tệp chào mừng. Lưu ý rằng đây có thể không phải là URL (chẳng hạn như /myproject/MyAction.action). Nó phải là một servlet được đặt tên và bạn không thể chuyển một chuỗi truy vấn tới servlet. Trình điều khiển servlet của bạn sẽ cần phải có một hành động mặc định.

<servlet> 
    <servlet-name>MyController</servlet-name> 
    <servlet-class>com.example.MyControllerServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyController</servlet-name> 
    <url-pattern>*.action</url-pattern> 
</servlet-mapping> 
<welcome-file-list> 
    <welcome-file>MyController</welcome-file> 
</welcome-file-list> 
+0

Điều này ngụ ý sử dụng struts 2, phải không? – Fabien

+1

Giải pháp này là khuôn khổ bất khả tri. Bạn có thể sử dụng nó với bất cứ điều gì, bạn chỉ cần tìm ra cách để chỉ định một hành động mặc định với khung đã chọn của bạn. –

+1

Làm việc cho tôi; cảm ơn vì tiền hỗ trợ! Trước đây tôi đã sử dụng như sau: '<% @ taglib prefix =" struts "uri =" http://struts.apache.org/tags-logic "%> ' – guymac

6

Điều tôi làm là đặt một tệp rỗng có cùng tên với hành động struts của bạn và đánh lừa vùng chứa để gọi hành động thanh chống.

Ví dụ: Nếu hành động struts của bạn là welcome.do, hãy tạo một tệp rỗng có tên welcome.do.Điều đó sẽ lừa container để gọi hành động Struts.

17

Đây là một chủ đề khá cũ nhưng chủ đề được thảo luận, tôi nghĩ, vẫn có liên quan. Tôi sử dụng một thẻ struts - s: action để đạt được điều này. Tôi tạo ra một index.jsp trong đó tôi đã viết này ...

<s:action name="loadHomePage" namespace="/load" executeResult="true" /> 
+0

Câu trả lời hay nhất khi bạn không mã hóa' struts.action.extension' trong tệp jsp của mình. 'Struts.action.extension' có thể thay đổi thành' action' và sau đó bạn cần thay đổi url 'request.redirect' trong jsp này. –

+1

Đây là cách duy nhất cho thanh chống 2. – VeenarM

-1

này hoạt động như giảm cũng cần một servlet mới hoặc jsp

<welcome-file-list> 
<welcome-file>/MyAction.action</welcome-file> 
</welcome-file-list> 
+1

Tính năng này không hoạt động. Có lẽ vì '' tìm kiếm một tệp _physical_ do đó "danh sách FILE chào mừng".Đó là lý do tại sao việc đặt một tệp rỗng có cùng tên với tên hành động trong thư mục gốc của ứng dụng (WebContent) hoạt động. – silver

1

đây hai blog với cùng kỹ thuật:

Nó đòi hỏi Servlet API> = v2.4:

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
    <url-pattern>/index.htm</url-pattern> <<== *1* 
</servlet-mapping> 
<welcome-file-list> 
    <welcome-file>index.htm</welcome-file> <<== *2* 
</welcome-file-list> 

để bạn không còn cần redirect.jsp trong phi WEB-INF thư mục !!

0

Chỉ cần thêm một bộ lọc trên bộ lọc Strut trong web.xml như thế này:

<filter> 
    <filter-name>customfilter</filter-name> 
    <filter-class>com.example.CustomFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>customfilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Và thêm đoạn mã sau vào phương pháp doFilter đó lớp CustomFilter

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
     FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest)servletRequest; 
    HttpServletResponse httpResponse = (HttpServletResponse)servletResponse; 
    if (! httpResponse.isCommitted()) { 
     if ((httpRequest.getContextPath() + "/").equals(httpRequest.getRequestURI())) { 
      httpResponse.sendRedirect(httpRequest.getContextPath() + "/MyAction"); 
     } 
     else { 
      filterChain.doFilter(servletRequest, servletResponse); 
     } 
    } 
} 

Vì vậy, Bộ lọc sẽ chuyển hướng tới hành động . Bạn không cần bất kỳ JSP nào được đặt bên ngoài WEB-INF.

-1

này đã làm việc tốt cho tôi, quá:

<welcome-file-list> 
<welcome-file>MyAction.action</welcome-file> 
</welcome-file-list> 

tôi đã không thể để có được những hành động mặc định để thực thi khi người dùng nhập vào các ứng dụng web sử dụng thư mục gốc của ứng dụng web (mywebapp /). Có một lỗi trong struts 2.3.12 sẽ không đi đến hành động mặc định hoặc sử dụng trang chào đón khi bạn sử dụng url gốc. Đây sẽ là một sự xuất hiện phổ biến. Một khi tôi thay đổi trở lại struts 2.1.8 nó làm việc tốt.

+1

Điều này không hoạt động. Có lẽ vì '' tìm kiếm một tệp _physical_ do đó "danh sách FILE chào mừng". Đó là lý do tại sao việc đặt một tệp rỗng có cùng tên với tên hành động trong thư mục gốc của ứng dụng (WebContent) hoạt động. – silver

0

Tôi đã định cấu hình như sau. nó hoạt động hoàn hảo và không có thay đổi URL ...

Tạo hành động giả như sau trong tệp struts2.xml. vì thế bất cứ khi nào chúng tôi truy cập vào ứng dụng như http://localhost:8080/myapp, nó sẽ chuyển tiếp đến hành động giả và sau đó nó chuyển hướng đến index.jsp/index.tiles ...

<action name=""> 
    <result type="tiles">/index.tiles</result> 
</action> 

w/o gạch

<action name=""> 
    <result>/index.jsp</result> 
</action> 

có thể chúng tôi định cấu hình một số hành động index.action trong web.xml dưới dạng <welcome-file>index.action</welcome-file> và sử dụng hành động đó để chuyển tiếp trang bắt buộc ...

1

there are this answer above nhưng nó không phải là rõ ràng về bối cảnh ứng dụng web nên tôi làm điều này:

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
<servlet> 
    <servlet-name>TilesDispatchServlet</servlet-name> 
    <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>TilesDispatchServlet</servlet-name> 
    <url-pattern>*.tiles</url-pattern> 
</servlet-mapping> 

Và trong index.jsp tôi chỉ cần viết:

<jsp:forward page="index.tiles" /> 

Và tôi có định nghĩa chỉ mục, tên index và tất cả mọi thứ đều hoạt động tốt và không phụ thuộc vào đường dẫn ngữ cảnh webapp.

0

Tôi gần như chắc chắn rằng các OP là giải pháp tốt nhất (không chắc chắn về thực hành tốt nhất, nhưng nó hoạt động hoàn hảo, và thực sự là giải pháp lãnh đạo dự án của tôi và tôi thích.)

Ngoài ra, tôi thấy nó có thể được kết hợp với an ninh mùa xuân như thế này:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 

<sec:authorize access="isAnonymous()"> 
    <% response.sendRedirect("/myApp/login/login.action?error=false"); %> 
</sec:authorize> 
<sec:authorize access="isAuthenticated() and (hasRole('ADMIN') or hasRole('USER'))"> 
    <% response.sendRedirect("/myApp/principal/principal.action"); %> 
</sec:authorize> 
<sec:authorize access="isAuthenticated() and hasRole('USER')"> 
    <% response.sendRedirect("/myApp/user/userDetails.action"); %> 
</sec:authorize> 

bằng cách này, không chỉ chúng tôi có thể kiểm soát những trang đầu tiên là hình thức đăng nhập, nhưng chúng tôi kiểm soát dòng chảy SAU người dùng được đăng nhập vào, tùy thuộc vào vai trò của mình . Làm việc như một say mê.

0

Mã dưới đây có thể được sử dụng trong struts.xml để tải trang chào mừng.

Thực hiện một số hành động trước khi tải trang chào mừng.

<!-- welcome page configuration -begin --> 
    <action name="" class="com.LoginAction"> 
     <result name="success">login.jsp</result> 
    </action> 
<!-- welcome page configuration -end --> 

Trả lại trực tiếp một số JSP mà không thực hiện Hành động.

<!-- welcome page configuration -begin --> 
    <action name=""> 
     <result name="success">login.jsp</result> 
    </action> 
<!-- welcome page configuration -end --> 

Không <welcome-file-list> là không cần thiết trong web.xml

Các vấn đề liên quan