Struts 2 - Hướng dẫn nhanh
Model View Controller hoặc MVCnhư nó được gọi phổ biến, là một mẫu thiết kế phần mềm để phát triển các ứng dụng web. Mẫu Bộ điều khiển Chế độ xem Mô hình được tạo thành từ ba phần sau:
Model - Mức thấp nhất của mẫu chịu trách nhiệm duy trì dữ liệu.
View - Điều này có trách nhiệm hiển thị tất cả hoặc một phần dữ liệu cho người dùng.
Controller - Mã phần mềm kiểm soát các tương tác giữa Mô hình và Chế độ xem.
MVC phổ biến vì nó tách biệt logic ứng dụng khỏi lớp giao diện người dùng và hỗ trợ tách các mối quan tâm. Tại đây Bộ điều khiển nhận tất cả các yêu cầu cho ứng dụng và sau đó làm việc với Mô hình để chuẩn bị bất kỳ dữ liệu nào mà Chế độ xem cần. Sau đó, Chế độ xem sử dụng dữ liệu do Bộ điều khiển chuẩn bị để tạo ra phản hồi có thể trình bày cuối cùng. Phần trừu tượng MVC có thể được biểu diễn bằng đồ thị như sau.
Ngươi mâu
Mô hình chịu trách nhiệm quản lý dữ liệu của ứng dụng. Nó phản hồi yêu cầu từ khung nhìn và nó cũng phản hồi các hướng dẫn từ bộ điều khiển để tự cập nhật.
Xem
Nó có nghĩa là trình bày dữ liệu theo một định dạng cụ thể, được kích hoạt bởi quyết định trình bày dữ liệu của người kiểm soát. Chúng là các hệ thống tạo mẫu dựa trên tập lệnh như JSP, ASP, PHP và rất dễ tích hợp với công nghệ AJAX.
Bộ điều khiển
Bộ điều khiển chịu trách nhiệm phản hồi đầu vào của người dùng và thực hiện các tương tác trên các đối tượng mô hình dữ liệu. Bộ điều khiển nhận đầu vào, nó xác nhận đầu vào và sau đó thực hiện hoạt động nghiệp vụ sửa đổi trạng thái của mô hình dữ liệu.
Struts2là một khuôn khổ dựa trên MVC. Trong các chương tới, chúng ta hãy xem cách chúng ta có thể sử dụng phương pháp MVC trong Struts2.
Struts2là một khung ứng dụng web phổ biến và hoàn thiện dựa trên mẫu thiết kế MVC. Struts2 không chỉ là một phiên bản mới của Struts 1, mà nó là một bản viết lại hoàn chỉnh của kiến trúc Struts.
Khung công tác web ban đầu bắt đầu với khung công tác Struts làm cơ sở và mục tiêu của nó là cung cấp một khung công tác nâng cao và cải tiến được xây dựng trên Struts để giúp phát triển web dễ dàng hơn cho các nhà phát triển.
Sau một thời gian, Webwork framework và cộng đồng Struts đã chung tay tạo ra Struts2 framework nổi tiếng.
Các tính năng của khung Struts 2
Dưới đây là một số tính năng tuyệt vời có thể buộc bạn phải cân nhắc đến Struts2 -
POJO Forms and POJO Actions- Struts2 đã loại bỏ các Biểu mẫu hành động vốn là một phần không thể thiếu của khung Struts. Với Struts2, bạn có thể sử dụng bất kỳ POJO nào để nhận đầu vào biểu mẫu. Tương tự, bây giờ bạn có thể xem bất kỳ POJO nào dưới dạng lớp Hành động.
Tag Support - Struts2 đã cải thiện các thẻ biểu mẫu và các thẻ mới cho phép các nhà phát triển viết ít mã hơn.
AJAX Support - Struts2 đã nhận ra sự tiếp quản của công nghệ Web2.0 và đã tích hợp hỗ trợ AJAX vào sản phẩm bằng cách tạo các thẻ AJAX, chức năng này rất giống với các thẻ Struts2 tiêu chuẩn.
Easy Integration - Tích hợp với các khung công tác khác như Spring, Tiles và SiteMesh giờ đây dễ dàng hơn với nhiều loại tích hợp có sẵn với Struts2.
Template Support - Hỗ trợ tạo các khung nhìn bằng cách sử dụng các mẫu.
Plugin Support- Hành vi cốt lõi của Struts2 có thể được nâng cao và tăng cường bằng cách sử dụng các plugin. Một số plugin có sẵn cho Struts2.
Profiling- Struts2 cung cấp cấu hình tích hợp để gỡ lỗi và cấu hình ứng dụng. Ngoài ra, Struts cũng cung cấp tính năng gỡ lỗi tích hợp với sự trợ giúp của các công cụ gỡ lỗi tích hợp sẵn.
Easy to Modify Tags- Đánh dấu thẻ trong Struts2 có thể được tinh chỉnh bằng cách sử dụng các mẫu của Freemarker. Điều này không yêu cầu kiến thức JSP hoặc java. Kiến thức cơ bản về HTML, XML và CSS là đủ để sửa đổi các thẻ.
Promote Less configuration- Struts2 thúc đẩy cấu hình ít hơn với sự trợ giúp của việc sử dụng các giá trị mặc định cho các cài đặt khác nhau. Bạn không phải định cấu hình thứ gì đó trừ khi nó khác với cài đặt mặc định do Struts2 đặt.
View Technologies - Struts2 hỗ trợ tuyệt vời cho nhiều tùy chọn chế độ xem (JSP, Freemarker, Velocity và XSLT)
Liệt kê ở trên là 10 tính năng hàng đầu của Struts 2 làm cho nó trở thành một khuôn khổ sẵn sàng cho Doanh nghiệp.
Struts 2 Nhược điểm
Mặc dù Struts 2 đi kèm với một danh sách các tính năng tuyệt vời, nhưng có một số hạn chế của phiên bản hiện tại - Struts 2 cần được cải thiện thêm. Liệt kê một số điểm chính -
Bigger Learning Curve - Để sử dụng MVC với Struts, bạn phải thoải mái với các API chuẩn JSP, Servlet và một khuôn khổ lớn và phức tạp.
Poor Documentation - So với các API tiêu chuẩn của servlet và JSP, Struts có ít tài nguyên trực tuyến hơn và nhiều người dùng lần đầu tiên thấy tài liệu Apache trực tuyến khó hiểu và được tổ chức kém.
Less Transparent - Với các ứng dụng Struts, có nhiều điều đằng sau hậu trường hơn so với các ứng dụng Web dựa trên Java thông thường, điều này gây khó khăn cho việc hiểu framework.
Lưu ý cuối cùng, một khung công tác tốt nên cung cấp hành vi chung mà nhiều loại ứng dụng khác nhau có thể sử dụng nó.
Struts 2 là một trong những khuôn khổ web tốt nhất và được sử dụng nhiều để phát triển các Ứng dụng Internet phong phú (RIA).
Nhiệm vụ đầu tiên của chúng tôi là chạy một ứng dụng Struts 2 tối thiểu. Chương này sẽ hướng dẫn bạn cách chuẩn bị một môi trường phát triển để bắt đầu công việc của bạn với Struts 2.
Tôi giả sử rằng bạn đã cài đặt JDK (5+), Tomcat và Eclipse trên máy của mình. Nếu bạn chưa cài đặt các thành phần này, hãy làm theo các bước đã cho trên đường nhanh -
Bước 1 - Thiết lập Bộ phát triển Java (JDK)
Bạn có thể tải xuống phiên bản SDK mới nhất từ trang web Java của Oracle - Java SE Downloads . Bạn sẽ tìm thấy hướng dẫn cài đặt JDK trong các tệp đã tải xuống, hãy làm theo hướng dẫn đã cho để cài đặt và định cấu hình thiết lập. Cuối cùng, đặt các biến môi trường PATH và JAVA_HOME để tham chiếu đến thư mục chứa java và javac, thường là java_install_dir / bin và java_install_dir tương ứng.
Nếu bạn đang chạy Windows và cài đặt SDK trong C: \ jdk1.5.0_20, bạn phải nhập dòng sau vào tệp C: \ autoexec.bat của mình.
set PATH = C:\jdk1.5.0_20\bin;%PATH%
set JAVA_HOME = C:\jdk1.5.0_20
Ngoài ra, trên Windows NT / 2000 / XP -
Bạn có thể nhấp chuột phải vào Máy tính của tôi, Chọn Thuộc tính, rồi Nâng cao, rồi Biến Môi trường. Sau đó, bạn sẽ cập nhật giá trị PATH và nhấn nút OK.
Trên Unix (Solaris, Linux, v.v.), nếu SDK được cài đặt trong /usr/local/jdk1.5.0_20 và bạn sử dụng trình bao C, bạn sẽ đưa phần sau vào tệp .cshrc của mình.
Trên Unix (Solaris, Linux, v.v.), nếu SDK được cài đặt trong /usr/local/jdk1.5.0_20 và bạn sử dụng trình bao C, bạn sẽ đưa phần sau vào tệp .cshrc của mình.
setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.5.0_20
Ngoài ra, nếu bạn sử dụng Môi trường phát triển tích hợp (IDE) như Borland JBuilder, Eclipse, IntelliJ IDEA hoặc Sun ONE Studio, hãy biên dịch và chạy một chương trình đơn giản để xác nhận rằng IDE biết bạn đã cài đặt Java ở đâu, nếu không, hãy thiết lập thích hợp theo tài liệu đã cho của IDE.
Bước 2 - Thiết lập Apache Tomcat
Bạn có thể tải xuống phiên bản Tomcat mới nhất từ https://tomcat.apache.org/. Sau khi bạn tải xuống bản cài đặt, hãy giải nén bản phân phối nhị phân vào một vị trí thuận tiện.
Ví dụ trong C: \ apache-tomcat-6.0.33 trên windows hoặc /usr/local/apachetomcat-6.0.33 trên Linux / Unix và tạo biến môi trường CATALINA_HOME trỏ đến các vị trí này.
Bạn có thể khởi động Tomcat bằng cách thực hiện các lệnh sau trên máy tính windows hoặc bạn có thể chỉ cần nhấp đúp vào startup.bat
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-6.0.33\bin\startup.bat
Tomcat có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-6.0.33/bin/startup.sh
Sau khi khởi động thành công, các ứng dụng web mặc định đi kèm với Tomcat sẽ khả dụng bằng cách truy cập http://localhost:8080/. Nếu mọi thứ đều ổn, thì nó sẽ hiển thị kết quả sau:
Thông tin thêm về cấu hình và chạy Tomcat có thể được tìm thấy trong tài liệu bao gồm tại đây, cũng như trên trang web Tomcat: https://tomcat.apache.org/
Có thể dừng Tomcat bằng cách thực hiện các lệnh sau trên máy tính Windows:
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-5.5.29\bin\shutdown
Có thể dừng Tomcat bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh
Bước 3 - Thiết lập Eclipse (IDE)
Tất cả các ví dụ trong hướng dẫn này được viết bằng Eclipse IDE. Tôi khuyên bạn nên cài đặt phiên bản Eclipse mới nhất trong máy của mình.
Để cài đặt Eclipse Tải xuống các tệp nhị phân Eclipse mới nhất từ https://www.eclipse.org/downloads/. Sau khi bạn tải xuống bản cài đặt, hãy giải nén bản phân phối nhị phân vào một vị trí thuận tiện.
Ví dụ trong C: \ eclipse trên windows hoặc / usr / local / eclipse trên Linux / Unix và cuối cùng đặt biến PATH một cách thích hợp. Eclipse có thể được khởi động bằng cách thực hiện các lệnh sau trên máy tính windows, hoặc bạn có thể chỉ cần nhấp đúp vào eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -
$/usr/local/eclipse/eclipse
Sau khi khởi động thành công, nếu mọi thứ đều ổn, nó sẽ hiển thị kết quả sau:
Bước 4 - Thiết lập Thư viện Struts2
Bây giờ nếu mọi thứ đều ổn, thì bạn có thể tiến hành thiết lập khung Struts2 của mình. Sau đây là các bước đơn giản để tải xuống và cài đặt Struts2 trên máy tính của bạn.
Chọn xem bạn muốn cài đặt Struts2 trên Windows hay Unix, sau đó tiến hành bước tiếp theo để tải xuống tệp .zip cho windows và tệp .tz cho Unix.
Tải xuống phiên bản mới nhất của nhị phân Struts2 từ https://struts.apache.org/download.cgi.
Tại thời điểm viết hướng dẫn này, tôi đã tải xuống struts-2.0.14-all.zip và khi bạn giải nén tệp đã tải xuống, nó sẽ cung cấp cho bạn cấu trúc thư mục bên trong C: \ struts-2.2.3 như sau.
Bước thứ hai là giải nén tệp zip ở bất kỳ vị trí nào, tôi đã tải xuống và giải nén struts-2.2.3-all.zip trong c:\ thư mục trên máy Windows 7 của tôi để tôi có tất cả các tệp jar vào C:\struts-2.2.3\lib. Đảm bảo bạn đặt biến CLASSPATH đúng cách nếu không bạn sẽ gặp sự cố khi chạy ứng dụng của mình.
Từ cấp độ cao, Struts2 là một khung pull-MVC (hoặc MVC2). Mẫu Model-ViewController trong Struts2 được triển khai với năm thành phần cốt lõi sau:
- Actions
- Interceptors
- Giá trị Stack / OGNL
- Kết quả / Loại kết quả
- Xem công nghệ
Struts 2 hơi khác so với một khuôn khổ MVC truyền thống, nơi hành động đóng vai trò của mô hình hơn là bộ điều khiển, mặc dù có một số chồng chéo.
Sơ đồ trên mô tả Model, View và Controller tới kiến trúc cấp cao Struts2. Bộ điều khiển được thực hiện vớiStruts2điều phối bộ lọc servlet cũng như các bộ chặn, mô hình này được thực hiện với các hành động và chế độ xem là sự kết hợp của các loại kết quả và kết quả. Ngăn xếp giá trị và OGNL cung cấp luồng chung, liên kết và cho phép tích hợp giữa các thành phần khác.
Ngoài các thành phần trên, sẽ có rất nhiều thông tin liên quan đến cấu hình. Cấu hình cho ứng dụng web, cũng như cấu hình cho các hành động, bộ chặn, kết quả, v.v.
Đây là tổng quan kiến trúc của mẫu Struts 2 MVC. Chúng ta sẽ đi qua từng thành phần chi tiết hơn trong các chương tiếp theo.
Yêu cầu vòng đời
Dựa trên sơ đồ trên, bạn có thể hiểu quy trình công việc thông qua vòng đời yêu cầu của người dùng trong Struts 2 như sau -
Người dùng gửi yêu cầu đến máy chủ để yêu cầu một số tài nguyên (tức là các trang).
Người điều phối bộ lọc xem xét yêu cầu và sau đó xác định Hành động thích hợp.
Các chức năng đánh chặn đã định cấu hình áp dụng như xác thực, tải tệp lên, v.v.
Hành động đã chọn được thực hiện dựa trên thao tác được yêu cầu.
Một lần nữa, các bộ đánh chặn được cấu hình sẽ được áp dụng để thực hiện bất kỳ quá trình xử lý hậu kỳ nào nếu được yêu cầu.
Cuối cùng, kết quả được chuẩn bị bởi khung nhìn và trả kết quả cho người dùng.
Như bạn đã học từ kiến trúc Struts 2, khi bạn nhấp vào siêu liên kết hoặc gửi biểu mẫu HTML trong ứng dụng web Struts 2, đầu vào được Bộ điều khiển thu thập và được gửi đến một lớp Java có tên là Hành động. Sau khi Hành động được thực thi, một kết quả sẽ chọn một tài nguyên để hiển thị phản hồi. Tài nguyên nói chung là JSP, nhưng nó cũng có thể là tệp PDF, bảng tính Excel hoặc cửa sổ ứng dụng Java.
Giả sử rằng bạn đã xây dựng môi trường phát triển của mình. Bây giờ, chúng ta hãy tiến hành xây dựngHello World Struts2dự án. Mục đích của dự án này là xây dựng một ứng dụng web thu thập tên người dùng và hiển thị "Hello World" theo sau là tên người dùng.
Chúng tôi sẽ phải tạo bốn thành phần sau cho bất kỳ dự án Struts 2 nào:
Sr.No | Thành phần & Mô tả |
---|---|
1 | Action Tạo một lớp hành động sẽ chứa logic nghiệp vụ hoàn chỉnh và kiểm soát sự tương tác giữa người dùng, mô hình và chế độ xem. |
2 | Interceptors Tạo các thiết bị đánh chặn nếu được yêu cầu hoặc sử dụng các phương tiện đánh chặn hiện có. Đây là một phần của Controller. |
3 | View Tạo một JSP để tương tác với người dùng để lấy đầu vào và trình bày các thông điệp cuối cùng. |
4 | Configuration Files Tạo các tệp cấu hình để ghép nối Bộ điều khiển, Chế độ xem và Hành động. Các tệp này là struts.xml, web.xml, struts.properties. |
Tôi sẽ sử dụng Eclipse IDE để tất cả các thành phần bắt buộc sẽ được tạo trong một Dự án Web Động. Bây giờ chúng ta hãy bắt đầu với việc tạo Dự án Web Động.
Tạo một dự án web động
Khởi động Eclipse của bạn và sau đó đi với File > New > Dynamic Web Project và nhập tên dự án là HelloWorldStruts2 và đặt phần còn lại của các tùy chọn như được đưa ra trong màn hình sau:
Chọn tất cả các tùy chọn mặc định trong màn hình tiếp theo và cuối cùng kiểm tra Generate Web.xml deployment descriptorLựa chọn. Thao tác này sẽ tạo một dự án web động cho bạn trong Eclipse. Bây giờ đi vớiWindows > Show View > Project Explorervà bạn sẽ thấy cửa sổ dự án của mình như bên dưới:
Bây giờ sao chép các tệp sau từ thư mục struts 2 lib C:\struts-2.2.3\lib đến dự án của chúng tôi WEB-INF\libthư mục. Để thực hiện việc này, bạn chỉ cần kéo và thả tất cả các tệp sau vào thư mục WEB-INF \ lib.
- commons-fileupload-x.y.z.jar
- commons-io-x.y.z.jar
- commons-lang-x.y.jar
- commons-logging-x.y.z.jar
- commons-logging-api-x.y.jar
- freemarker-x.y.z.jar
- javassist-.xy.z.GA
- ognl-x.y.z.jar
- struts2-core-x.y.z.jar
- xwork-core.x.y.z.jar
Tạo lớp hành động
Lớp hành động là chìa khóa cho ứng dụng Struts 2 và chúng tôi triển khai hầu hết logic nghiệp vụ trong lớp hành động. Vì vậy, hãy để chúng tôi tạo một tệp java HelloWorldAction.java dướiJava Resources > src với một tên gói com.tutorialspoint.struts2 với các nội dung được đưa ra dưới đây.
Lớp Hành động phản hồi hành động của người dùng khi người dùng nhấp vào URL. Một hoặc nhiều phương thức của lớp Hành động được thực thi và kết quả là Chuỗi được trả về. Dựa trên giá trị của kết quả, một trang JSP cụ thể được hiển thị.
package com.tutorialspoint.struts2;
public class HelloWorldAction {
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Đây là một lớp rất đơn giản với một thuộc tính được gọi là "name". Chúng tôi có các phương thức getters và setter tiêu chuẩn cho thuộc tính "name" và một phương thức thực thi trả về chuỗi "thành công".
Khung Struts 2 sẽ tạo một đối tượng của HelloWorldActionvà gọi phương thức được thực thi để phản hồi lại hành động của người dùng. Bạn đặt logic nghiệp vụ của mình bên trong phương thức này, phương thức này cuối cùng trả về hằng số Chuỗi. Nói cách khác, đối với mỗi URL, bạn sẽ phải triển khai một lớp hành động và bạn có thể sử dụng trực tiếp tên lớp đó làm tên hành động của mình hoặc bạn có thể ánh xạ tới một số tên khác bằng cách sử dụng tệp struts.xml như được hiển thị bên dưới.
Tạo chế độ xem
Chúng ta cần một JSP để trình bày thông báo cuối cùng, trang này sẽ được gọi bởi Struts 2 framework khi một hành động được xác định trước sẽ xảy ra và ánh xạ này sẽ được định nghĩa trong tệp struts.xml. Vì vậy, hãy để chúng tôi tạo tệp jsp dưới đâyHelloWorld.jsptrong thư mục WebContent trong dự án nhật thực của bạn. Để làm điều này, nhấp chuột phải vào thư mục WebContent trong trình khám phá dự án và chọnNew >JSP File.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
Lệnh taglib cho vùng chứa Servlet biết rằng trang này sẽ sử dụng Struts 2 và các thẻ này sẽ đứng trước s.
Thẻ s: property hiển thị giá trị của thuộc tính class action "name> được trả về bởi phương thức getName() của lớp HelloWorldAction.
Tạo trang chính
Chúng tôi cũng cần tạo index.jsptrong thư mục WebContent. Tệp này sẽ đóng vai trò là URL hành động ban đầu nơi người dùng có thể nhấp để yêu cầu khung Struts 2 gọi một phương thức đã xác định của lớp HelloWorldAction và hiển thị dạng xem HelloWorld.jsp.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
Các hellohành động được xác định trong tệp dạng xem trên sẽ được ánh xạ tới lớp HelloWorldAction và phương thức thực thi của nó bằng cách sử dụng tệp struts.xml. Khi người dùng nhấp vào nút Gửi, khung công tác Struts 2 chạy phương thức thực thi được xác định trong lớp HelloWorldAction và dựa trên giá trị trả về của phương thức, một dạng xem thích hợp sẽ được chọn và hiển thị dưới dạng phản hồi.
Tệp cấu hình
Chúng ta cần một ánh xạ để liên kết URL, lớp HelloWorldAction (Model) và HelloWorld.jsp (chế độ xem) với nhau. Ánh xạ cho khung Struts 2 biết lớp nào sẽ phản hồi hành động của người dùng (URL), phương thức nào của lớp đó sẽ được thực thi và khung nhìn nào sẽ hiển thị dựa trên kết quả Chuỗi mà phương thức trả về.
Vì vậy, hãy để chúng tôi tạo một tệp có tên struts.xml. Vì Struts 2 yêu cầu struts.xml phải có trong thư mục lớp. Do đó, tạo tệp struts.xml trong thư mục WebContent / WEB-INF / class. Eclipse không tạo thư mục "lớp" theo mặc định, vì vậy bạn cần tự thực hiện việc này. Để làm điều này, nhấp chuột phải vào thư mục WEB-INF trong trình khám phá dự án và chọnNew > Folder. Struts.xml của bạn sẽ giống như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Vài từ cần được hiểu về tệp cấu hình trên. Ở đây, chúng tôi đặt hằng sốstruts.devMode đến true, bởi vì chúng tôi đang làm việc trong môi trường phát triển và chúng tôi cần xem một số thông báo nhật ký hữu ích. Sau đó, chúng tôi xác định một gói được gọi làhelloworld.
Tạo một gói rất hữu ích khi bạn muốn nhóm các hành động của mình lại với nhau. Trong ví dụ của chúng tôi, chúng tôi đặt tên cho hành động của mình là "xin chào", tương ứng với URL/hello.action và được sao lưu bởiHelloWorldAction.class. Cácexecute phương pháp của HelloWorldAction.class là phương thức được chạy khi URL /hello.actionĐược gọi. Nếu kết quả của phương thức thực thi trả về "thành công", thì chúng tôi đưa người dùng đếnHelloWorld.jsp.
Bước tiếp theo là tạo một web.xmltệp là điểm nhập cho bất kỳ yêu cầu nào đến Struts 2. Điểm vào của ứng dụng Struts2 sẽ là một bộ lọc được xác định trong bộ mô tả triển khai (web.xml). Do đó, chúng tôi sẽ xác định một mục nhập của lớp org.apache.struts2.dispatcher.FilterDispatcher trong web.xml. Tệp web.xml cần được tạo trong thư mục WEB-INF trong WebContent. Eclipse đã tạo một tệp web.xml khung cho bạn khi bạn tạo dự án. Vì vậy, hãy chỉ cần sửa đổi nó như sau:
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Chúng tôi đã chỉ định index.jsp làm tệp chào mừng của chúng tôi. Sau đó, chúng tôi đã định cấu hình bộ lọc Struts2 để chạy trên tất cả các url (tức là bất kỳ url nào phù hợp với mẫu / *)
Để bật nhật ký chi tiết
Bạn có thể bật chức năng ghi nhật ký hoàn chỉnh trong khi làm việc với Struts 2 bằng cách tạo logging.properties nộp dưới WEB-INF/classesthư mục. Giữ hai dòng sau trong tệp tài sản của bạn -
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
java.util.logging.ConsoleHandler
Logging.properties mặc định chỉ định một ConsoleHandler để định tuyến ghi nhật ký đến stdout và cũng là một FileHandler. Ngưỡng mức nhật ký của trình xử lý có thể được đặt bằng cách sử dụng SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST hoặc ALL.
Đó là nó. Chúng tôi đã sẵn sàng để chạy ứng dụng Hello World của mình bằng cách sử dụng khuôn khổ Struts 2.
Thủ tục thực hiện ứng dụng
Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR File để tạo tệp Chiến tranh.
Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat.
Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URL http://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ cung cấp cho bạn màn hình sau:
Nhập giá trị "Struts2" và gửi trang. Bạn sẽ thấy trang tiếp theo
Lưu ý rằng bạn có thể xác định index dưới dạng một hành động trong tệp struts.xml và trong trường hợp đó, bạn có thể gọi trang chỉ mục là http://localhost:8080/HelloWorldStruts2/index.action. Kiểm tra bên dưới cách bạn có thể xác định chỉ mục như một hành động -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "index">
<result >/index.jsp</result>
</action>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Chương này sẽ đưa bạn đến cấu hình cơ bản cần thiết cho một Struts 2ứng dụng. Ở đây chúng ta sẽ thấy những gì có thể được định cấu hình với sự trợ giúp của một số tệp cấu hình quan trọng nhưweb.xml, struts.xml, strutsconfig.xml và struts.properties
Thành thật mà nói, bạn có thể bắt đầu làm việc bằng cách sử dụng web.xml và struts.xmlcác tệp cấu hình (như bạn đã thấy trong chương trước của chúng tôi, nơi ví dụ của chúng tôi hoạt động bằng cách sử dụng hai tệp này). Tuy nhiên, đối với kiến thức của bạn, chúng tôi cũng sẽ giải thích về các tệp khác.
Tệp web.xml
Tệp cấu hình web.xml là tệp cấu hình J2EE xác định cách các phần tử của yêu cầu HTTP được xử lý bởi vùng chứa servlet. Nó không hoàn toàn là một tệp cấu hình Struts2, nhưng nó là một tệp cần được cấu hình để Struts2 hoạt động.
Như đã thảo luận trước đó, tệp này cung cấp một điểm nhập cho bất kỳ ứng dụng web nào. Điểm vào của ứng dụng Struts2 sẽ là một bộ lọc được xác định trong bộ mô tả triển khai (web.xml). Do đó, chúng tôi sẽ xác định một mục nhập của lớp FilterDispatcher trong web.xml. Tệp web.xml cần được tạo trong thư mụcWebContent/WEB-INF.
Đây là tệp cấu hình đầu tiên bạn sẽ cần cấu hình nếu bạn đang khởi động mà không có sự hỗ trợ của mẫu hoặc công cụ tạo ra nó (chẳng hạn như Eclipse hoặc Maven2).
Sau đây là nội dung của tệp web.xml mà chúng tôi đã sử dụng trong ví dụ trước.
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Lưu ý rằng chúng tôi ánh xạ bộ lọc Struts 2 tới /*, và không /*.actioncó nghĩa là tất cả các url sẽ được phân tích cú pháp bởi bộ lọc thanh chống. Chúng tôi sẽ đề cập đến vấn đề này khi chúng tôi xem qua chương Chú thích.
Tệp Struts.xml
Các struts.xmltệp chứa thông tin cấu hình mà bạn sẽ sửa đổi khi các hành động được phát triển. Tệp này có thể được sử dụng để ghi đè cài đặt mặc định cho một ứng dụng, ví dụ: struts.devMode = false và các cài đặt khác được xác định trong tệp thuộc tính. Tệp này có thể được tạo trong thư mụcWEB-INF/classes.
Chúng ta hãy xem tệp struts.xml mà chúng ta đã tạo trong ví dụ Hello World được giải thích trong chương trước.
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
<-- more actions can be listed here -->
</package>
<-- more packages can be listed here -->
</struts>
Điều đầu tiên cần lưu ý là DOCTYPE. Tất cả tệp cấu hình thanh chống cần có loại tài liệu chính xác như được hiển thị trong ví dụ nhỏ của chúng tôi. <struts> là phần tử thẻ gốc, theo đó chúng tôi khai báo các gói khác nhau bằng cách sử dụng thẻ <package>. Ở đây <package> cho phép phân tách và mô-đun hóa cấu hình. Điều này rất hữu ích khi bạn có một dự án lớn và dự án được chia thành các mô-đun khác nhau.
Ví dụ: nếu dự án của bạn có ba miền - business_application, customer_application và staff_application, thì bạn có thể tạo ba gói và lưu trữ các hành động được liên kết trong gói thích hợp.
Thẻ gói có các thuộc tính sau:
Sr.No | Thuộc tính & Mô tả |
---|---|
1 | name (required) Số nhận dạng duy nhất cho gói |
2 | extends Gói này gia hạn từ gói nào? Theo mặc định, chúng tôi sử dụng struts-default làm gói cơ sở. |
3 | abstract Nếu được đánh dấu là true, gói này không có sẵn cho người dùng cuối. |
4 | namespace Không gian tên duy nhất cho các hành động |
Các constant thẻ cùng với các thuộc tính tên và giá trị nên được sử dụng để ghi đè bất kỳ thuộc tính nào sau đây được xác định trong default.properties, giống như chúng tôi vừa thiết lập struts.devModebất động sản. Cài đặtstruts.devMode thuộc tính cho phép chúng tôi xem thêm thông báo gỡ lỗi trong tệp nhật ký.
Chúng tôi xác định action các thẻ tương ứng với mọi URL mà chúng tôi muốn truy cập và chúng tôi xác định một lớp với phương thức execute () sẽ được truy cập bất cứ khi nào chúng tôi truy cập vào URL tương ứng.
Kết quả xác định những gì được trả về trình duyệt sau khi một hành động được thực thi. Chuỗi được trả về từ hành động phải là tên của một kết quả. Kết quả được định cấu hình cho mỗi hành động như trên hoặc dưới dạng kết quả "chung", có sẵn cho mọi hành động trong một gói. Kết quả có tùy chọnname và typethuộc tính. Giá trị tên mặc định là "thành công".
Tệp Struts.xml có thể phát triển lớn theo thời gian và vì vậy việc chia nhỏ nó theo từng gói là một cách để mô-đun hóa nó, nhưng Strutscung cấp một cách khác để mô-đun hóa tệp struts.xml. Bạn có thể chia tệp thành nhiều tệp xml và nhập chúng theo cách sau.
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="my-struts1.xml"/>
<include file="my-struts2.xml"/>
</struts>
Tệp cấu hình khác mà chúng tôi chưa đề cập là struts-default.xml. Tệp này chứa các cài đặt cấu hình tiêu chuẩn cho Struts và bạn sẽ không phải chạm vào các cài đặt này cho 99,99% dự án của mình. Vì lý do này, chúng tôi sẽ không đi vào quá nhiều chi tiết về tệp này. Nếu bạn quan tâm, hãy xem quadefault.properties tệp có sẵn trong tệp struts2-core-2.2.3.jar.
Tệp Struts-config.xml
Tệp cấu hình struts-config.xml là liên kết giữa các thành phần Chế độ xem và Mô hình trong Máy khách web nhưng bạn sẽ không phải chạm vào các cài đặt này cho 99,99% dự án của mình.
Tệp cấu hình về cơ bản chứa các phần tử chính sau:
Sr.No | Đánh chặn & Mô tả |
---|---|
1 | struts-config Đây là nút gốc của tệp cấu hình. |
2 | form-beans Đây là nơi bạn ánh xạ lớp con ActionForm của mình thành một tên. Bạn sử dụng tên này làm bí danh cho ActionForm của mình trong suốt phần còn lại của tệp strutsconfig.xml và thậm chí trên các trang JSP của bạn. |
3 | global forwards Phần này ánh xạ một trang trên ứng dụng web của bạn với một tên. Bạn có thể sử dụng tên này để tham khảo trang thực tế. Điều này tránh mã hóa cứng các URL trên các trang web của bạn. |
4 | action-mappings Đây là nơi bạn khai báo các trình xử lý biểu mẫu và chúng còn được gọi là ánh xạ hành động. |
5 | controller Phần này cấu hình nội bộ Struts và hiếm khi được sử dụng trong các tình huống thực tế. |
6 | plug-in Phần này cho Struts biết nơi tìm các tệp thuộc tính của bạn, các tệp này chứa lời nhắc và thông báo lỗi |
Sau đây là tệp struts-config.xml mẫu:
<?xml version = "1.0" Encoding = "ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<!-- ========== Form Bean Definitions ============ -->
<form-beans>
<form-bean name = "login" type = "test.struts.LoginForm" />
</form-beans>
<!-- ========== Global Forward Definitions ========= -->
<global-forwards>
</global-forwards>
<!-- ========== Action Mapping Definitions ======== -->
<action-mappings>
<action
path = "/login"
type = "test.struts.LoginAction" >
<forward name = "valid" path = "/jsp/MainMenu.jsp" />
<forward name = "invalid" path = "/jsp/LoginView.jsp" />
</action>
</action-mappings>
<!-- ========== Controller Definitions ======== -->
<controller contentType = "text/html;charset = UTF-8"
debug = "3" maxFileSize = "1.618M" locale = "true" nocache = "true"/>
</struts-config>
Để biết thêm chi tiết về tệp struts-config.xml, vui lòng kiểm tra tài liệu về struts của bạn.
Tệp Struts.properties
Tệp cấu hình này cung cấp một cơ chế để thay đổi hành vi mặc định của khung. Trên thực tế, tất cả các thuộc tính có trongstruts.properties tệp cấu hình cũng có thể được định cấu hình trong web.xml sử dụng init-param, cũng như sử dụng thẻ không đổi trong struts.xmltập tin cấu hình. Tuy nhiên, nếu bạn muốn giữ mọi thứ riêng biệt và các thanh chống cụ thể hơn, thì bạn có thể tạo tệp này trong thư mụcWEB-INF/classes.
Các giá trị được định cấu hình trong tệp này sẽ ghi đè các giá trị mặc định được định cấu hình trong default.propertiesđược chứa trong phân phối struts2-core-xyzjar. Có một số thuộc tính mà bạn có thể cân nhắc thay đổi bằng cách sử dụngstruts.properties tập tin -
### When set to true, Struts will act much more friendly for developers
struts.devMode = true
### Enables reloading of internationalization files
struts.i18n.reload = true
### Enables reloading of XML configuration files
struts.configuration.xml.reload = true
### Sets the port that the server is run on
struts.url.http.port = 8080
Đây bất kỳ dòng nào bắt đầu bằng hash (#) sẽ được coi là một nhận xét và nó sẽ bị bỏ qua bởi Struts 2.
Actionslà cốt lõi của khung Struts2, vì chúng dành cho bất kỳ khung MVC (Model View Controller) nào. Mỗi URL được ánh xạ tới một hành động cụ thể, cung cấp logic xử lý cần thiết để phục vụ yêu cầu từ người dùng.
Nhưng hành động này cũng phục vụ trong hai năng lực quan trọng khác. Thứ nhất, hành động đóng một vai trò quan trọng trong việc chuyển dữ liệu từ yêu cầu đến chế độ xem, cho dù là JSP hay loại kết quả khác. Thứ hai, hành động phải hỗ trợ khuôn khổ xác định kết quả nào sẽ hiển thị chế độ xem sẽ được trả về khi phản hồi yêu cầu.
Tạo hành động
Yêu cầu duy nhất cho các hành động trong Struts2là phải có một phương thức noargument trả về một đối tượng Chuỗi hoặc Kết quả và phải là một POJO. Nếu phương thức no-đối số không được chỉ định, hành vi mặc định là sử dụng phương thức execute ().
Tùy ý, bạn có thể mở rộng ActionSupport lớp triển khai sáu giao diện bao gồm Actiongiao diện. Giao diện Hành động như sau:
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
Chúng ta hãy xem xét phương thức hành động trong ví dụ Hello World -
package com.tutorialspoint.struts2;
public class HelloWorldAction {
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Để minh họa quan điểm rằng phương thức hành động kiểm soát chế độ xem, chúng ta hãy thực hiện thay đổi sau đối với execute và mở rộng lớp ActionSupport như sau:
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
if ("SECRET".equals(name)) {
return SUCCESS;
} else {
return ERROR;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Trong ví dụ này, chúng ta có một số logic trong phương thức thực thi để xem thuộc tính name. Nếu thuộc tính bằng với chuỗi"SECRET", chúng tôi trở lại SUCCESS kết quả là nếu không, chúng tôi trở lại ERRORkết quả là. Vì chúng tôi đã mở rộng ActionSupport, vì vậy chúng tôi có thể sử dụng hằng số ChuỗiSUCCESSvà ERROR. Bây giờ, hãy để chúng tôi sửa đổi tệp struts.xml của chúng tôi như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
Tạo chế độ xem
Hãy để chúng tôi tạo tệp jsp dưới đây HelloWorld.jsptrong thư mục WebContent trong dự án nhật thực của bạn. Để làm điều này, nhấp chuột phải vào thư mục WebContent trong trình khám phá dự án và chọnNew >JSP File. Tệp này sẽ được gọi trong trường hợp kết quả trả về là SUCCESS, là "thành công" của hằng chuỗi như được định nghĩa trong giao diện Hành động -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
Sau đây là tệp sẽ được gọi bởi khuôn khổ trong trường hợp kết quả hành động là LỖI, bằng với "lỗi" hằng chuỗi. Sau đây là nội dung củaAccessDenied.jsp
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Access Denied</title>
</head>
<body>
You are not authorized to view this page.
</body>
</html>
Chúng tôi cũng cần tạo index.jsptrong thư mục WebContent. Tệp này sẽ đóng vai trò là URL hành động ban đầu nơi người dùng có thể nhấp vào để yêu cầu khung Struts 2 gọiexecutephương thức của lớp HelloWorldAction và hiển thị dạng xem HelloWorld.jsp.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
Vậy là xong, không cần thay đổi đối với tệp web.xml, vì vậy hãy sử dụng cùng một web.xml mà chúng tôi đã tạo Exampleschương. Bây giờ, chúng tôi đã sẵn sàng chạyHello World ứng dụng sử dụng Struts 2 framework.
Thực thi ứng dụng
Nhấp chuột phải vào tên dự án và nhấp vào Export > WARTệp để tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ cung cấp cho bạn màn hình sau:
Hãy để chúng tôi nhập một từ là "SECRET" và bạn sẽ thấy trang sau:
Bây giờ nhập bất kỳ từ nào khác ngoài "SECRET" và bạn sẽ thấy trang sau:
Tạo nhiều hành động
Bạn sẽ thường xuyên xác định nhiều hành động để xử lý các yêu cầu khác nhau và cung cấp các URL khác nhau cho người dùng, do đó bạn sẽ xác định các lớp khác nhau như được định nghĩa bên dưới -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
class MyAction extends ActionSupport {
public static String GOOD = SUCCESS;
public static String BAD = ERROR;
}
public class HelloWorld extends ActionSupport {
...
public String execute() {
if ("SECRET".equals(name)) return MyAction.GOOD;
return MyAction.BAD;
}
...
}
public class SomeOtherClass extends ActionSupport {
...
public String execute() {
return MyAction.GOOD;
}
...
}
Bạn sẽ cấu hình các hành động này trong tệp struts.xml như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorld"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
<action name = "something"
class = "com.tutorialspoint.struts2.SomeOtherClass"
method = "execute">
<result name = "success">/Something.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
Như bạn có thể thấy trong ví dụ giả định ở trên, kết quả hành động SUCCESS và ERROR’s được nhân đôi.
Để giải quyết vấn đề này, bạn nên tạo một lớp chứa các kết quả kết quả.
Các bộ chặn về mặt khái niệm giống như bộ lọc servlet hoặc lớp Proxy JDKs. Các bộ đánh chặn cho phép thực hiện chức năng cắt ngang riêng biệt với hành động cũng như khuôn khổ. Bạn có thể đạt được những điều sau đây bằng cách sử dụng các thiết bị đánh chặn -
Cung cấp logic tiền xử lý trước khi hành động được gọi.
Cung cấp logic hậu xử lý sau khi hành động được gọi.
Bắt các ngoại lệ để có thể thực hiện xử lý thay thế.
Nhiều tính năng được cung cấp trong Struts2 khuôn khổ được thực hiện bằng cách sử dụng các thiết bị đánh chặn;
Examples bao gồm xử lý ngoại lệ, tải lên tệp, gọi lại vòng đời, v.v. Thực tế, vì Struts2 nhấn mạnh nhiều chức năng của nó trên các bộ đánh chặn, nên nó không có khả năng được chỉ định 7 hoặc 8 bộ đánh chặn cho mỗi hành động.
Struts2 Framework đánh chặn
Khung công tác Struts 2 cung cấp một danh sách tốt các thiết bị đánh chặn hiện có được cấu hình sẵn và sẵn sàng sử dụng. Một vài trong số các thiết bị đánh chặn quan trọng được liệt kê dưới đây -
Sr.No | Đánh chặn & Mô tả |
---|---|
1 | alias Cho phép các tham số có các bí danh tên khác nhau trên các yêu cầu. |
2 | checkbox Hỗ trợ quản lý các hộp kiểm bằng cách thêm giá trị tham số là false cho các hộp kiểm không được chọn. |
3 | conversionError Đặt thông tin lỗi từ việc chuyển đổi chuỗi thành các loại tham số vào trường lỗi của hành động. |
4 | createSession Tự động tạo một phiên HTTP nếu một phiên chưa tồn tại. |
5 | debugging Cung cấp một số màn hình gỡ lỗi khác nhau cho nhà phát triển. |
6 | execAndWait Đưa người dùng đến trang chờ trung gian trong khi hành động thực hiện ở chế độ nền. |
7 | exception Bản đồ các ngoại lệ được chuyển từ một hành động đến một kết quả, cho phép xử lý ngoại lệ tự động thông qua chuyển hướng. |
số 8 | fileUpload Tạo điều kiện cho việc tải tệp lên dễ dàng. |
9 | i18n Theo dõi ngôn ngữ đã chọn trong phiên của người dùng. |
10 | logger Cung cấp ghi nhật ký đơn giản bằng cách xuất ra tên của hành động đang được thực thi. |
11 | params Đặt các tham số yêu cầu cho hành động. |
12 | prepare Điều này thường được sử dụng để thực hiện công việc tiền xử lý, chẳng hạn như thiết lập kết nối cơ sở dữ liệu. |
13 | profile Cho phép thông tin hồ sơ đơn giản được ghi lại cho các hành động. |
14 | scope Lưu trữ và truy xuất trạng thái của hành động trong phạm vi phiên hoặc ứng dụng. |
15 | ServletConfig Cung cấp hành động với quyền truy cập vào các thông tin dựa trên servlet khác nhau. |
16 | timer Cung cấp thông tin hồ sơ đơn giản dưới dạng thời gian thực thi hành động. |
17 | token Kiểm tra hành động để tìm mã thông báo hợp lệ để ngăn việc gửi biểu mẫu trùng lặp. |
18 | validation Cung cấp hỗ trợ xác thực cho các hành động |
Vui lòng xem tài liệu Struts 2 để biết chi tiết đầy đủ về các thiết bị đánh chặn nói trên. Nhưng tôi sẽ chỉ cho bạn cách sử dụng một bộ đánh chặn nói chung trong ứng dụng Struts của bạn.
Làm thế nào để sử dụng Interceptors?
Hãy để chúng tôi xem cách sử dụng một thiết bị đánh chặn đã có cho chương trình "Hello World" của chúng tôi. Chúng tôi sẽ sử dụngtimerinterceptor có mục đích là đo thời gian thực hiện một phương thức hành động. Đồng thời, tôi đang sử dụngparamsinterceptor có mục đích là gửi các tham số yêu cầu cho hành động. Bạn có thể thử ví dụ của mình mà không cần sử dụng bộ đánh chặn này và bạn sẽ thấy rằngname thuộc tính không được đặt vì thông số không thể truy cập vào hành động.
Chúng tôi sẽ giữ các tệp HelloWorldAction.java, web.xml, HelloWorld.jsp và index.jsp như chúng đã được tạo trong Examples nhưng hãy để chúng tôi sửa đổi struts.xml tệp để thêm một bộ đánh chặn như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<interceptor-ref name = "params"/>
<interceptor-ref name = "timer" />
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ hãy nhập bất kỳ từ nào vào hộp văn bản đã cho và nhấp vào nút Nói Xin chào để thực hiện hành động đã xác định. Bây giờ nếu bạn kiểm tra nhật ký được tạo, bạn sẽ tìm thấy văn bản sau:
INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.
Đây là điểm mấu chốt đang được tạo ra vì timer máy đánh chặn thông báo rằng hành động đó mất tổng cộng 109ms để thực hiện.
Tạo các thiết bị chặn tùy chỉnh
Sử dụng bộ chặn tùy chỉnh trong ứng dụng của bạn là một cách thanh lịch để cung cấp các tính năng ứng dụng cắt ngang. Dễ dàng tạo ra một thiết bị đánh chặn tùy chỉnh; giao diện cần được mở rộng như sauInterceptor giao diện -
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation)
throws Exception;
}
Như tên gợi ý, phương thức init () cung cấp một cách để khởi tạo bộ đánh chặn và phương thức hủy () cung cấp một cơ sở để dọn dẹp bộ đánh chặn. Không giống như các hành động, các bộ chặn được sử dụng lại trên các yêu cầu và cần phải an toàn cho luồng, đặc biệt là phương thức intercept ().
Các ActionInvocationđối tượng cung cấp quyền truy cập vào môi trường thời gian chạy. Nó cho phép truy cập vào chính hành động và các phương thức để gọi hành động và xác định xem hành động đã được gọi hay chưa.
Nếu bạn không cần mã khởi tạo hoặc mã dọn dẹp, AbstractInterceptorlớp học có thể được mở rộng. Điều này cung cấp một triển khai không hoạt động mặc định của các phương thức init () và tiêu diệt ().
Tạo lớp đánh chặn
Hãy để chúng tôi tạo MyInterceptor.java sau trong Java Resources > src thư mục -
package com.tutorialspoint.struts2;
import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception {
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
return result;
}
}
Như bạn nhận thấy, hành động thực tế sẽ được thực hiện bằng cách sử dụng bộ đánh chặn bằng invocation.invoke()gọi. Vì vậy, bạn có thể thực hiện một số xử lý trước và một số xử lý sau dựa trên yêu cầu của bạn.
Bản thân khung công tác bắt đầu quá trình bằng cách thực hiện lệnh gọi đầu tiên tới invoke () của đối tượng ActionInvocation. Mỗi lầninvoke()được gọi, ActionInvocation tham khảo trạng thái của nó và thực thi bất kỳ bộ đánh chặn nào đến tiếp theo. Khi tất cả các bộ đánh chặn được cấu hình đã được gọi, phương thức invoke () sẽ khiến chính hành động đó được thực thi.
Sơ đồ sau đây cho thấy khái niệm tương tự thông qua luồng yêu cầu:
Tạo lớp hành động
Hãy để chúng tôi tạo một tệp java HelloWorldAction.java dưới Java Resources > src với một tên gói com.tutorialspoint.struts2 với các nội dung được đưa ra dưới đây.
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
System.out.println("Inside action....");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Đây là cùng một lớp mà chúng ta đã thấy trong các ví dụ trước. Chúng tôi có các phương thức getters và setter tiêu chuẩn cho thuộc tính "name" và một phương thức thực thi trả về chuỗi "thành công".
Tạo chế độ xem
Hãy để chúng tôi tạo tệp jsp dưới đây HelloWorld.jsp trong thư mục WebContent trong dự án nhật thực của bạn.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
Tạo trang chính
Chúng tôi cũng cần tạo index.jsptrong thư mục WebContent. Tệp này sẽ đóng vai trò là URL hành động ban đầu, nơi người dùng có thể nhấp vào để yêu cầu khung Struts 2 gọi phương thức đã xác định của lớp HelloWorldAction và hiển thị dạng xem HelloWorld.jsp.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
Các hello hành động được xác định trong tệp dạng xem trên sẽ được ánh xạ tới lớp HelloWorldAction và phương thức thực thi của nó bằng cách sử dụng tệp struts.xml.
Tệp cấu hình
Bây giờ, chúng ta cần đăng ký bộ đánh chặn của mình và sau đó gọi nó như chúng ta đã gọi bộ đánh chặn mặc định trong ví dụ trước. Để đăng ký một trình đánh chặn mới được xác định, các thẻ <interceptors> ... </interceptors> được đặt ngay dưới thẻ <package> instruts.xmltập tin. Bạn có thể bỏ qua bước này đối với bộ đánh chặn mặc định như chúng ta đã làm trong ví dụ trước. Nhưng ở đây chúng ta hãy đăng ký và sử dụng nó như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<interceptors>
<interceptor name = "myinterceptor"
class = "com.tutorialspoint.struts2.MyInterceptor" />
</interceptors>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<interceptor-ref name = "params"/>
<interceptor-ref name = "myinterceptor" />
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Cần lưu ý rằng bạn có thể đăng ký nhiều hơn một bộ đánh chặn bên trong <package> và đồng thời, bạn có thể gọi nhiều hơn một bộ chặn bên trong <action>nhãn. Bạn có thể gọi cùng một máy đánh chặn với các hành động khác nhau.
Tệp web.xml cần được tạo trong thư mục WEB-INF trong WebContent như sau:
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ hãy nhập bất kỳ từ nào vào hộp văn bản đã cho và nhấp vào nút Nói Xin chào để thực hiện hành động đã xác định. Bây giờ nếu bạn kiểm tra nhật ký đã tạo, bạn sẽ tìm thấy văn bản sau ở dưới cùng:
Pre-Processing
Inside action....
Post-Processing
Xếp chồng nhiều thiết bị đánh chặn
Như bạn có thể tưởng tượng, việc phải cấu hình nhiều thiết bị đánh chặn cho mỗi hành động sẽ nhanh chóng trở nên cực kỳ khó quản lý. Vì lý do này, các thiết bị đánh chặn được quản lý bằng các ngăn xếp đánh chặn. Đây là một ví dụ, trực tiếp từ tệp strutsdefault.xml -
<interceptor-stack name = "basicStack">
<interceptor-ref name = "exception"/>
<interceptor-ref name = "servlet-config"/>
<interceptor-ref name = "prepare"/>
<interceptor-ref name = "checkbox"/>
<interceptor-ref name = "params"/>
<interceptor-ref name = "conversionError"/>
</interceptor-stack>
Số tiền trên được gọi là basicStackvà có thể được sử dụng trong cấu hình của bạn như hình dưới đây. Nút cấu hình này được đặt dưới nút <package ... />. Mỗi thẻ <interceptor-ref ... /> tham chiếu đến một bộ đánh chặn hoặc một ngăn xếp đánh chặn đã được cấu hình trước ngăn xếp đánh chặn hiện tại. Do đó, điều rất quan trọng là phải đảm bảo rằng tên là duy nhất trên tất cả các cấu hình ngăn xếp bộ đánh chặn và bộ đánh chặn khi định cấu hình bộ đánh chặn và ngăn xếp bộ đánh chặn ban đầu.
Chúng ta đã thấy cách áp dụng bộ đánh chặn vào hành động, việc áp dụng bộ đánh chặn cũng không khác gì. Trên thực tế, chúng tôi sử dụng chính xác cùng một thẻ -
<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
<interceptor-ref name = "basicStack"/>
<result>view.jsp</result>
</action
Việc đăng ký "basicStack" ở trên sẽ đăng ký cổ phần hoàn chỉnh của tất cả sáu bộ đánh chặn với hành động chào. Điều này cần lưu ý rằng các bộ đánh chặn được thực thi theo thứ tự mà chúng đã được cấu hình. Ví dụ, trong trường hợp trên, ngoại lệ sẽ được thực thi đầu tiên, thứ hai sẽ là servlet-config, v.v.
Như đã đề cập trước đây, <results> thẻ đóng vai trò của một viewtrong khung Struts2 MVC. Hành động chịu trách nhiệm thực hiện logic nghiệp vụ. Bước tiếp theo sau khi thực hiện logic nghiệp vụ là hiển thị dạng xem bằng cách sử dụng<results> nhãn.
Thường có một số quy tắc điều hướng được đính kèm với kết quả. Ví dụ: nếu phương pháp hành động là xác thực người dùng, có ba kết quả có thể xảy ra.
- Đăng nhập thành công
- Đăng nhập không thành công - Tên người dùng hoặc mật khẩu không chính xác
- Tài khoản bị khóa
Trong trường hợp này, phương thức hành động sẽ được định cấu hình với ba chuỗi kết quả có thể có và ba chế độ xem khác nhau để hiển thị kết quả. Chúng ta đã thấy điều này trong các ví dụ trước.
Tuy nhiên, Struts2 không ràng buộc bạn với việc sử dụng JSP làm công nghệ xem. Sau cùng, toàn bộ mục đích của mô hình MVC là giữ cho các lớp tách biệt và có thể cấu hình cao. Ví dụ: đối với máy khách Web2.0, bạn có thể muốn trả về XML hoặc JSON làm đầu ra. Trong trường hợp này, bạn có thể tạo một kiểu kết quả mới cho XML hoặc JSON và đạt được điều này.
Struts đi kèm với một số result types và bất cứ điều gì chúng ta đã thấy đó là loại kết quả mặc định dispatcher, được sử dụng để gửi đến các trang JSP. Struts cho phép bạn sử dụng các ngôn ngữ đánh dấu khác cho công nghệ xem để trình bày kết quả và các lựa chọn phổ biến bao gồmVelocity, Freemaker, XSLT và Tiles.
Loại kết quả điều phối viên
Các dispatcherloại kết quả là loại mặc định và được sử dụng nếu không có loại kết quả nào khác được chỉ định. Nó được sử dụng để chuyển tiếp đến một servlet, JSP, trang HTML, v.v. trên máy chủ. Nó sử dụng phương thức RequestDispatcher.osystem () .
Chúng tôi đã thấy phiên bản "tốc ký" trong các ví dụ trước đó của chúng tôi, nơi chúng tôi cung cấp một đường dẫn JSP làm phần nội dung của thẻ kết quả.
<result name = "success">
/HelloWorld.jsp
</result>
Chúng tôi cũng có thể chỉ định tệp JSP bằng thẻ <param name = "location"> trong phần tử <result ...> như sau:
<result name = "success" type = "dispatcher">
<param name = "location">
/HelloWorld.jsp
</param >
</result>
Chúng tôi cũng có thể cung cấp một parsetham số này đúng theo mặc định. Tham số phân tích cú pháp xác định xem tham số vị trí có được phân tích cú pháp cho các biểu thức OGNL hay không.
Loại kết quả FreeMaker
Trong ví dụ này, chúng ta sẽ xem cách chúng ta có thể sử dụng FreeMakernhư công nghệ xem. Freemaker là một công cụ tạo khuôn mẫu phổ biến được sử dụng để tạo đầu ra bằng cách sử dụng các mẫu được xác định trước. Bây giờ chúng ta hãy tạo một tệp mẫu Freemaker có tên làhello.fm với các nội dung sau -
Hello World ${name}
Tệp trên là một mẫu trong đó namelà một tham số sẽ được truyền từ bên ngoài bằng hành động đã xác định. Bạn sẽ giữ tệp này trong CLASSPATH của mình.
Tiếp theo, hãy để chúng tôi sửa đổi struts.xml để xác định kết quả như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success" type = "freemarker">
<param name = "location">/hello.fm</param>
</result>
</action>
</package>
</struts>
Hãy để chúng tôi giữ các tệp HelloWorldAction.java, HelloWorldAction.jsp và index.jsp của chúng tôi như chúng tôi đã tạo chúng trong chương ví dụ.
Bây giờ Nhấp chuột phải vào tên dự án và nhấp Export > WAR File để tạo tệp Chiến tranh.
Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau.
Nhập giá trị "Struts2" và gửi trang. Bạn sẽ thấy trang tiếp theo.
Như bạn có thể thấy, điều này giống hệt như khung nhìn JSP ngoại trừ việc chúng tôi không bị ràng buộc với việc sử dụng JSP làm công nghệ khung nhìn. Chúng tôi đã sử dụng Freemaker trong ví dụ này.
Loại kết quả chuyển hướng
Các redirectloại kết quả gọi phương thức response.sendRedirect () tiêu chuẩn , khiến trình duyệt tạo một yêu cầu mới đến vị trí đã cho.
Chúng tôi có thể cung cấp vị trí trong phần thân của phần tử <result ...> hoặc dưới dạng phần tử <param name = "location">. Redirect cũng hỗ trợparsetham số. Đây là một ví dụ được định cấu hình bằng XML -
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success" type = "redirect">
<param name = "location">
/NewWorld.jsp
</param >
</result>
</action>
Vì vậy, chỉ cần sửa đổi tệp struts.xml của bạn để xác định loại chuyển hướng như đã đề cập ở trên và tạo tệp mới NewWorld.jpg nơi bạn sẽ được chuyển hướng bất cứ khi nào hành động hello sẽ trả về thành công. Bạn có thể kiểm tra ví dụ về Hành động chuyển hướng của Struts 2 để hiểu rõ hơn.
Ngăn xếp giá trị
Ngăn xếp giá trị là một tập hợp một số đối tượng giữ cho các đối tượng sau theo thứ tự đã cho:
Sr.No | Đối tượng & Mô tả |
---|---|
1 | Temporary Objects Có nhiều đối tượng tạm thời khác nhau được tạo ra trong quá trình thực thi một trang. Ví dụ: giá trị lặp lại hiện tại cho một tập hợp đang được lặp lại trong thẻ JSP. |
2 | The Model Object Nếu bạn đang sử dụng các đối tượng mô hình trong ứng dụng thanh chống của mình, đối tượng mô hình hiện tại được đặt trước hành động trên ngăn xếp giá trị. |
3 | The Action Object Đây sẽ là đối tượng hành động hiện tại đang được thực thi. |
4 | Named Objects Các đối tượng này bao gồm #application, #session, #request, #attr và #parameters và tham chiếu đến các phạm vi servlet tương ứng. |
Có thể truy cập ngăn xếp giá trị thông qua các thẻ được cung cấp cho JSP, Velocity hoặc Freemarker. Có nhiều thẻ khác nhau mà chúng ta sẽ nghiên cứu trong các chương riêng biệt, được sử dụng để lấy và thiết lập ngăn xếp giá trị struts 2.0. Bạn có thể lấy đối tượng valueStack bên trong action của mình như sau:
ActionContext.getContext().getValueStack()
Khi bạn có một đối tượng ValueStack, bạn có thể sử dụng các phương pháp sau để thao tác đối tượng đó:
Sr.No | Mô tả & Phương thức ValueStack |
---|---|
1 | Object findValue(String expr) Tìm một giá trị bằng cách đánh giá biểu thức đã cho so với ngăn xếp theo thứ tự tìm kiếm mặc định. |
2 | CompoundRoot getRoot() Lấy CompoundRoot để giữ các đối tượng được đẩy lên ngăn xếp. |
3 | Object peek() Đưa đối tượng lên đầu ngăn xếp mà không làm thay đổi ngăn xếp. |
4 | Object pop() Lấy đối tượng trên cùng của ngăn xếp và loại bỏ nó khỏi ngăn xếp. |
5 | void push(Object o) Đặt đối tượng này lên trên cùng của ngăn xếp. |
6 | void set(String key, Object o) Đặt một đối tượng trên ngăn xếp bằng khóa đã cho để nó có thể truy xuất được bằng findValue (key, ...) |
7 | void setDefaultType(Class defaultType) Đặt loại mặc định để chuyển đổi thành nếu không có loại nào được cung cấp khi nhận giá trị. |
số 8 | void setValue(String expr, Object value) Cố gắng đặt một thuộc tính trên bean trong ngăn xếp với biểu thức đã cho bằng cách sử dụng thứ tự tìm kiếm mặc định. |
9 | int size() Lấy số đối tượng trong ngăn xếp. |
OGNL
Các Object-Graph Navigation Language(OGNL) là một ngôn ngữ biểu thức mạnh mẽ được sử dụng để tham chiếu và thao tác dữ liệu trên ValueStack. OGNL cũng giúp truyền dữ liệu và chuyển đổi kiểu.
OGNL rất giống với Ngôn ngữ biểu thức JSP. OGNL dựa trên ý tưởng có đối tượng gốc hoặc đối tượng mặc định trong ngữ cảnh. Các thuộc tính của đối tượng mặc định hoặc gốc có thể được tham chiếu bằng cách sử dụng ký hiệu đánh dấu, là ký hiệu bảng Anh.
Như đã đề cập trước đó, OGNL dựa trên một ngữ cảnh và Struts xây dựng một bản đồ ActionContext để sử dụng với OGNL. Bản đồ ActionContext bao gồm:
Application - Các biến phạm vi ứng dụng
Session - Các biến phạm vi phiên
Root / value stack - Tất cả các biến hành động của bạn được lưu trữ tại đây
Request - Yêu cầu các biến phạm vi
Parameters - Yêu cầu tham số
Atributes - Các thuộc tính được lưu trữ trong phạm vi trang, yêu cầu, phiên và ứng dụng
Điều quan trọng là phải hiểu rằng đối tượng Action luôn có sẵn trong ngăn xếp giá trị. Do đó, nếu đối tượng Action của bạn có thuộc tính“x” và “y” có sẵn cho bạn sử dụng.
Các đối tượng trong ActionContext được tham chiếu bằng ký hiệu pound, tuy nhiên, các đối tượng trong ngăn xếp giá trị có thể được tham chiếu trực tiếp.
Ví dụ, nếu employee là một thuộc tính của một lớp hành động, sau đó nó có thể được tham chiếu như sau:
<s:property value = "name"/>
thay vì
<s:property value = "#name"/>
Nếu bạn có một thuộc tính trong phiên gọi là "đăng nhập", bạn có thể truy xuất thuộc tính đó như sau:
<s:property value = "#session.login"/>
OGNL cũng hỗ trợ xử lý các tập hợp - cụ thể là Bản đồ, Danh sách và Tập hợp. Ví dụ: để hiển thị danh sách màu thả xuống, bạn có thể làm:
<s:select name = "color" list = "{'red','yellow','green'}" />
Biểu thức OGNL rất thông minh khi giải thích "đỏ", "vàng", "xanh lá cây" là các màu và xây dựng một danh sách dựa trên đó.
Các biểu thức OGNL sẽ được sử dụng nhiều trong các chương tiếp theo khi chúng ta sẽ nghiên cứu các thẻ khác nhau. Vì vậy, thay vì xem xét chúng một cách riêng lẻ, chúng ta hãy xem xét nó bằng cách sử dụng một số ví dụ trong phần Thẻ biểu mẫu / Thẻ điều khiển / Thẻ dữ liệu và thẻ Ajax.
Ví dụ về ValueStack / OGNL
Tạo hành động
Chúng ta hãy xem xét lớp hành động sau, nơi chúng ta đang truy cập valueStack và sau đó thiết lập một số khóa mà chúng ta sẽ truy cập bằng OGNL trong chế độ xem của chúng ta, tức là trang JSP.
package com.tutorialspoint.struts2;
import java.util.*;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
ValueStack stack = ActionContext.getContext().getValueStack();
Map<String, Object> context = new HashMap<String, Object>();
context.put("key1", new String("This is key1"));
context.put("key2", new String("This is key2"));
stack.push(context);
System.out.println("Size of the valueStack: " + stack.size());
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Trên thực tế, Struts 2 thêm hành động của bạn lên đầu valueStack khi được thực thi. Vì vậy, cách thông thường để đặt nội dung trên Value Stack là thêm getters / setters cho các giá trị vào lớp Hành động của bạn và sau đó sử dụng thẻ <s: property> để truy cập các giá trị. Nhưng tôi đang chỉ cho bạn cách chính xác ActionContext và ValueStack hoạt động trong thanh chống.
Tạo chế độ xem
Hãy để chúng tôi tạo tệp jsp dưới đây HelloWorld.jsptrong thư mục WebContent trong dự án nhật thực của bạn. Chế độ xem này sẽ được hiển thị trong trường hợp hành động trả về thành công -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Entered value : <s:property value = "name"/><br/>
Value of key 1 : <s:property value = "key1" /><br/>
Value of key 2 : <s:property value = "key2" /> <br/>
</body>
</html>
Chúng tôi cũng cần tạo index.jsp trong thư mục WebContent có nội dung như sau:
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
Tệp cấu hình
Sau đây là nội dung của struts.xml tập tin -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat.
Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URL http://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau
Bây giờ nhập bất kỳ từ nào vào hộp văn bản đã cho và nhấp vào nút "Say Hello" để thực hiện hành động đã xác định. Bây giờ, nếu bạn kiểm tra nhật ký đã tạo, bạn sẽ tìm thấy văn bản sau ở dưới cùng:
Size of the valueStack: 3
Thao tác này sẽ hiển thị màn hình sau, màn hình sẽ hiển thị bất kỳ giá trị nào bạn sẽ nhập và giá trị của key1 và key2 mà chúng tôi đã đặt trên ValueStack.
Khung Struts 2 cung cấp hỗ trợ tích hợp để xử lý tải lên tệp bằng "Tải lên tệp dựa trên biểu mẫu trong HTML". Khi một tệp được tải lên, nó thường sẽ được lưu trữ trong một thư mục tạm thời và chúng sẽ được xử lý hoặc di chuyển bởi lớp Hành động của bạn vào một thư mục cố định để đảm bảo dữ liệu không bị mất.
Note - Máy chủ có thể có chính sách bảo mật cấm bạn ghi vào các thư mục khác với thư mục tạm thời và các thư mục thuộc ứng dụng web của bạn.
Có thể tải lên tệp trong Struts thông qua một bộ chặn được xác định trước được gọi là FileUpload interceptor có sẵn thông qua lớp org.apache.struts2.interceptor.FileUploadInterceptor và được bao gồm như một phần củadefaultStack. Bạn vẫn có thể sử dụng nó trong struts.xml của mình để thiết lập các tham số khác nhau như chúng ta sẽ thấy bên dưới.
Tạo tệp xem
Hãy để chúng tôi bắt đầu với việc tạo chế độ xem của chúng tôi, chế độ này sẽ được yêu cầu để duyệt và tải lên một tệp đã chọn. Vì vậy, hãy để chúng tôi tạo ra mộtindex.jsp với biểu mẫu tải lên HTML thuần túy cho phép người dùng tải lên tệp -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action = "upload" method = "post" enctype = "multipart/form-data">
<label for = "myFile">Upload your file</label>
<input type = "file" name = "myFile" />
<input type = "submit" value = "Upload"/>
</form>
</body>
</html>
Có một số điểm đáng chú ý trong ví dụ trên. Đầu tiên, enctype của biểu mẫu được đặt thànhmultipart/form-data. Điều này phải được đặt để quá trình tải lên tệp được xử lý thành công bởi trình chặn tải tệp lên. Điểm tiếp theo cần lưu ý là phương thức hành động của biểu mẫuupload và tên của trường tải lên tệp - đó là myFile. Chúng ta cần thông tin này để tạo phương thức hành động và cấu hình thanh chống.
Tiếp theo, chúng ta hãy tạo một tệp jsp đơn giản success.jsp để hiển thị kết quả tải lên tệp của chúng tôi trong trường hợp nó thành công.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>File Upload Success</title>
</head>
<body>
You have successfully uploaded <s:property value = "myFileFileName"/>
</body>
</html>
Sau đây sẽ là tệp kết quả error.jsp trong trường hợp có một số lỗi khi tải tệp lên -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>File Upload Error</title>
</head>
<body>
There has been an error in uploading the file.
</body>
</html>
Tạo lớp hành động
Tiếp theo, chúng ta hãy tạo một lớp Java có tên là uploadFile.java sẽ đảm nhận việc tải lên tệp và lưu trữ tệp đó ở một vị trí an toàn -
package com.tutorialspoint.struts2;
import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException;
import com.opensymphony.xwork2.ActionSupport;
public class uploadFile extends ActionSupport {
private File myFile;
private String myFileContentType;
private String myFileFileName;
private String destPath;
public String execute() {
/* Copy file to a safe location */
destPath = "C:/apache-tomcat-6.0.33/work/";
try {
System.out.println("Src File name: " + myFile);
System.out.println("Dst File name: " + myFileFileName);
File destFile = new File(destPath, myFileFileName);
FileUtils.copyFile(myFile, destFile);
} catch(IOException e) {
e.printStackTrace();
return ERROR;
}
return SUCCESS;
}
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
}
Các uploadFile.javalà một lớp rất đơn giản. Điều quan trọng cần lưu ý là bộ đánh chặn FileUpload cùng với bộ đánh chặn tham số thực hiện tất cả những công việc nặng nhọc cho chúng ta.
Trình đánh chặn FileUpload làm cho ba tham số có sẵn cho bạn theo mặc định. Chúng được đặt tên theo mẫu sau:
[your file name parameter] - Đây là tệp thực tế mà người dùng đã tải lên. Trong ví dụ này, nó sẽ là "myFile"
[your file name parameter]ContentType- Đây là loại nội dung của tệp đã được tải lên. Trong ví dụ này, nó sẽ là "myFileContentType"
[your file name parameter]FileName- Đây là tên của tệp đã được tải lên. Trong ví dụ này, nó sẽ là "myFileFileName"
Ba tham số có sẵn cho chúng tôi, nhờ vào Struts Interceptors. Tất cả những gì chúng ta phải làm là tạo ba tham số có tên chính xác trong lớp Hành động của chúng ta và tự động các biến này được tự động chuyển đổi cho chúng ta. Vì vậy, trong ví dụ trên, chúng ta có ba tham số và một phương thức hành động chỉ đơn giản trả về "thành công" nếu mọi thứ diễn ra tốt đẹp, ngược lại nó trả về "lỗi".
Tệp cấu hình
Sau đây là các thuộc tính cấu hình Struts2 kiểm soát quá trình tải lên tệp:
Sr.No | Thuộc tính & Mô tả |
---|---|
1 | struts.multipart.maxSize Kích thước tối đa (tính bằng byte) của tệp được chấp nhận là tệp tải lên. Mặc định là 250M. |
2 | struts.multipart.parser Thư viện được sử dụng để tải lên biểu mẫu nhiều phần. Theo mặc định làjakarta |
3 | struts.multipart.saveDir Vị trí lưu tệp tạm thời. Theo mặc định là javax.servlet.context.tempdir. |
Để thay đổi bất kỳ cài đặt nào trong số này, bạn có thể sử dụng constant trong tệp struts.xml ứng dụng của bạn, như tôi đã làm để thay đổi kích thước tối đa của tệp được tải lên.
Hãy để chúng tôi có của chúng tôi struts.xml như sau -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<constant name = "struts.multipart.maxSize" value = "1000000" />
<package name = "helloworld" extends = "struts-default">
<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
Từ, FileUploadinterceptor là một phần của Stack of interceptor mặc định, chúng ta không cần phải cấu hình nó rõ ràng. Tuy nhiên, bạn có thể thêm thẻ <interceptor-ref> bên trong <action>. Trình đánh chặn tệp tin tải xuống có hai tham số(a) maximumSize và (b) allowedTypes.
Tham số MaximumSize đặt kích thước tệp tối đa cho phép (mặc định là khoảng 2MB). Tham số allowTypes là danh sách các loại nội dung được chấp nhận (MIME) được phân tách bằng dấu phẩy như được minh họa bên dưới -
<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
<interceptor-ref name = "basicStack">
<interceptor-ref name = "fileUpload">
<param name = "allowedTypes">image/jpeg,image/gif</param>
</interceptor-ref>
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
Sau đây là nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Bây giờ Nhấp chuột phải vào tên dự án và nhấp Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/upload.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ, hãy chọn một tệp "Contacts.txt" bằng cách sử dụng nút Duyệt qua và nhấp vào nút tải lên, nút này sẽ tải tệp lên trên lần phân phát của bạn và bạn sẽ thấy trang tiếp theo. Bạn có thể kiểm tra xem tệp đã tải lên có được lưu trong C: \ apache-tomcat-6.0.33 \ work.
Lưu ý rằng FileUpload Interceptor sẽ tự động xóa tệp đã tải lên, vì vậy bạn sẽ phải lưu tệp đã tải lên theo chương trình tại một số vị trí trước khi nó bị xóa.
Thông báo lỗi
Trình đánh chặn fileUplaod sử dụng một số khóa thông báo lỗi mặc định -
Sr.No | Mã & Mô tả Thông báo Lỗi |
---|---|
1 | struts.messages.error.uploading Một lỗi chung xảy ra khi không thể tải tệp lên. |
2 | struts.messages.error.file.too.large Xảy ra khi tệp được tải lên quá lớn như được chỉ định bởi MaximumSize. |
3 | struts.messages.error.content.type.not.allowed Xảy ra khi tệp được tải lên không khớp với loại nội dung mong đợi được chỉ định. |
Bạn có thể ghi đè văn bản của những tin nhắn này trong WebContent/WEB-INF/classes/messages.properties các tệp tài nguyên.
Chương này sẽ hướng dẫn bạn cách truy cập cơ sở dữ liệu bằng Struts 2 trong các bước đơn giản. Struts là một khung công tác MVC và không phải là một khung cơ sở dữ liệu nhưng nó cung cấp hỗ trợ tuyệt vời cho việc tích hợp JPA / Hibernate. Chúng ta sẽ xem xét tích hợp ngủ đông trong chương sau, nhưng trong chương này, chúng ta sẽ sử dụng JDBC cũ thuần túy để truy cập cơ sở dữ liệu.
Bước đầu tiên trong chương này là thiết lập và xây dựng cơ sở dữ liệu của chúng tôi. Tôi đang sử dụng MySQL làm cơ sở dữ liệu của mình cho ví dụ này. Tôi đã cài đặt MySQL trên máy của mình và tôi đã tạo một cơ sở dữ liệu mới có tên là "struts_tutorial". Tôi đã tạo một bảng có tênloginvà điền vào nó một số giá trị. Dưới đây là tập lệnh tôi đã sử dụng để tạo và điền bảng.
Cơ sở dữ liệu MYSQL của tôi có tên người dùng mặc định "root" và mật khẩu "root123"
CREATE TABLE `struts_tutorial`.`login` (
`user` VARCHAR( 10 ) NOT NULL ,
`password` VARCHAR( 10 ) NOT NULL ,
`name` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `user` )
) ENGINE = InnoDB;
INSERT INTO `struts_tutorial`.`login` (`user`, `password`, `name`)
VALUES ('scott', 'navy', 'Scott Burgemott');
Bước tiếp theo là tải xuống tệp jar MySQL Connector và đặt tệp này vào thư mục WEB-INF \ lib của dự án của bạn. Sau khi hoàn thành việc này, chúng ta đã sẵn sàng để tạo lớp hành động.
Tạo hành động
Lớp hành động có các thuộc tính tương ứng với các cột trong bảng cơ sở dữ liệu. Chúng ta cóuser, password và namedưới dạng thuộc tính Chuỗi. Trong phương thức hành động, chúng tôi sử dụng thông số người dùng và mật khẩu để kiểm tra xem người dùng có tồn tại hay không, nếu có, chúng tôi hiển thị tên người dùng trong màn hình tiếp theo.
Nếu người dùng nhập sai thông tin, chúng tôi sẽ gửi lại họ đến màn hình đăng nhập.
Sau đây là nội dung của LoginAction.java tập tin -
package com.tutorialspoint.struts2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String user;
private String password;
private String name;
public String execute() {
String ret = ERROR;
Connection conn = null;
try {
String URL = "jdbc:mysql://localhost/struts_tutorial";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, "root", "root123");
String sql = "SELECT name FROM login WHERE";
sql+=" user = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
name = rs.getString(1);
ret = SUCCESS;
}
} catch (Exception e) {
ret = ERROR;
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
return ret;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Tạo trang chính
Bây giờ, hãy để chúng tôi tạo một tệp JSP index.jspđể thu thập tên người dùng và mật khẩu. Tên người dùng và mật khẩu này sẽ được kiểm tra dựa trên cơ sở dữ liệu.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
</head>
<body>
<form action = "loginaction" method = "post">
User:<br/><input type = "text" name = "user"/><br/>
Password:<br/><input type = "password" name = "password"/><br/>
<input type = "submit" value = "Login"/>
</form>
</body>
</html>
Tạo chế độ xem
Bây giờ hãy để chúng tôi tạo success.jsp tệp sẽ được gọi trong trường hợp hành động trả về SUCCESS, nhưng chúng tôi sẽ có một tệp xem khác trong trường hợp LỖI được trả về từ hành động.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Successful Login</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
Sau đây sẽ là tệp xem error.jsp trong trường hợp có LỖI được trả về từ hành động.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Invalid User Name or Password</title>
</head>
<body>
Wrong user name or password provided.
</body>
</html>
Tệp cấu hình
Cuối cùng, chúng ta hãy tập hợp mọi thứ lại với nhau bằng cách sử dụng tệp cấu hình struts.xml như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "loginaction"
class = "com.tutorialspoint.struts2.LoginAction"
method = "execute">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Nhập tên người dùng và mật khẩu sai. Bạn sẽ thấy trang tiếp theo.
Bây giờ nhập scott như tên người dùng và navylàm mật khẩu. Bạn sẽ thấy trang tiếp theo.
Chương này giải thích cách bạn có thể gửi email bằng ứng dụng Struts 2 của mình.
Đối với bài tập này, bạn cần tải xuống và cài đặt mail.jar từ JavaMail API 1.4.4 và đặtmail.jar tệp trong thư mục WEB-INF \ lib của bạn và sau đó tiến hành làm theo các bước tiêu chuẩn để tạo tệp hành động, chế độ xem và cấu hình.
Tạo hành động
Bước tiếp theo là tạo một phương thức Hành động để xử lý việc gửi email. Hãy để chúng tôi tạo một lớp mới có tên làEmailer.java với các nội dung sau.
package com.tutorialspoint.struts2;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.opensymphony.xwork2.ActionSupport;
public class Emailer extends ActionSupport {
private String from;
private String password;
private String to;
private String subject;
private String body;
static Properties properties = new Properties();
static {
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
}
public String execute() {
String ret = SUCCESS;
try {
Session session = Session.getDefaultInstance(properties,
new javax.mail.Authenticator() {
protected PasswordAuthentication
getPasswordAuthentication() {
return new
PasswordAuthentication(from, password);
}
}
);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject);
message.setText(body);
Transport.send(message);
} catch(Exception e) {
ret = ERROR;
e.printStackTrace();
}
return ret;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public static Properties getProperties() {
return properties;
}
public static void setProperties(Properties properties) {
Emailer.properties = properties;
}
}
Như đã thấy trong mã nguồn ở trên, Emailer.javacó các thuộc tính tương ứng với các thuộc tính biểu mẫu trong trang email.jsp được cung cấp bên dưới. Các thuộc tính này là -
From- Địa chỉ email của người gửi. Vì chúng tôi đang sử dụng SMTP của Google, chúng tôi cần một id gtalk hợp lệ
Password - Mật khẩu của tài khoản trên
To - Gửi email cho ai?
Subject - chủ đề của email
Body - Thông điệp email thực tế
Chúng tôi chưa xem xét bất kỳ xác nhận nào trên các trường trên, các xác nhận sẽ được bổ sung trong chương tiếp theo. Bây giờ chúng ta hãy xem xét phương thức execute (). Phương thức execute () sử dụng thư viện javax Mail để gửi email bằng các tham số được cung cấp. Nếu thư được gửi thành công, hành động trả về THÀNH CÔNG, ngược lại, nó trả về LỖI.
Tạo trang chính
Hãy để chúng tôi viết tệp JSP trang chính index.jsp, sẽ được sử dụng để thu thập thông tin liên quan đến email được đề cập ở trên -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Email Form</title>
</head>
<body>
<em>The form below uses Google's SMTP server.
So you need to enter a gmail username and password
</em>
<form action = "emailer" method = "post">
<label for = "from">From</label><br/>
<input type = "text" name = "from"/><br/>
<label for = "password">Password</label><br/>
<input type = "password" name = "password"/><br/>
<label for = "to">To</label><br/>
<input type = "text" name = "to"/><br/>
<label for = "subject">Subject</label><br/>
<input type = "text" name = "subject"/><br/>
<label for = "body">Body</label><br/>
<input type = "text" name = "body"/><br/>
<input type = "submit" value = "Send Email"/>
</form>
</body>
</html>
Tạo chế độ xem
Chúng tôi sẽ sử dụng tệp JSP success.jsp sẽ được gọi trong trường hợp hành động trả về SUCCESS, nhưng chúng tôi sẽ có một tệp dạng xem khác trong trường hợp LỖI được trả về từ hành động.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Email Success</title>
</head>
<body>
Your email to <s:property value = "to"/> was sent successfully.
</body>
</html>
Sau đây sẽ là tệp xem error.jsp trong trường hợp có LỖI được trả về từ hành động.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Email Error</title>
</head>
<body>
There is a problem sending your email to <s:property value = "to"/>.
</body>
</html>
Tệp cấu hình
Bây giờ chúng ta hãy tập hợp mọi thứ lại với nhau bằng cách sử dụng tệp cấu hình struts.xml như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "emailer"
class = "com.tutorialspoint.struts2.Emailer"
method = "execute">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Nhập thông tin cần thiết và nhấp vào Send Emailcái nút. Nếu mọi thứ diễn ra tốt đẹp, thì bạn sẽ thấy trang sau.
Trong chương này, chúng ta sẽ xem xét sâu hơn về khung xác thực Struts. Tại lõi Struts, chúng ta có khung xác thực hỗ trợ ứng dụng chạy các quy tắc để thực hiện xác thực trước khi phương thức hành động được thực thi.
Xác thực phía máy khách thường đạt được bằng cách sử dụng Javascript. Tuy nhiên, không nên chỉ dựa vào xác nhận phía máy khách. Các phương pháp hay nhất gợi ý rằng việc xác nhận nên được giới thiệu ở tất cả các cấp trong khuôn khổ ứng dụng của bạn. Bây giờ chúng ta hãy xem xét hai cách để thêm xác thực vào dự án Struts của chúng tôi.
Ở đây, chúng tôi sẽ lấy một ví dụ về Employee tên và tuổi sẽ được ghi lại bằng cách sử dụng một trang đơn giản và chúng tôi sẽ đặt hai xác thực này để đảm bảo rằng người dùng luôn nhập tên và tuổi phải nằm trong khoảng từ 28 đến 65.
Chúng ta hãy bắt đầu với trang JSP chính của ví dụ.
Tạo trang chính
Hãy để chúng tôi viết tệp JSP trang chính index.jsp, sẽ được sử dụng để thu thập thông tin liên quan đến Nhân viên được đề cập ở trên.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form</title>
</head>
<body>
<s:form action = "empinfo" method = "post">
<s:textfield name = "name" label = "Name" size = "20" />
<s:textfield name = "age" label = "Age" size = "20" />
<s:submit name = "submit" label = "Submit" align="center" />
</s:form>
</body>
</html>
Index.jsp sử dụng thẻ Struts mà chúng ta chưa đề cập đến, nhưng chúng ta sẽ nghiên cứu chúng trong các chương liên quan đến thẻ. Nhưng hiện tại, chỉ cần giả sử rằng thẻ s: textfield in một trường đầu vào và s: submit in ra một nút gửi. Chúng tôi đã sử dụng thuộc tính nhãn cho mỗi thẻ để tạo nhãn cho mỗi thẻ.
Tạo chế độ xem
Chúng tôi sẽ sử dụng tệp JSP success.jsp sẽ được gọi trong trường hợp hành động được xác định trả về SUCCESS.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
Employee Information is captured successfully.
</body>
</html>
Tạo hành động
Vì vậy, chúng ta hãy xác định một lớp hành động nhỏ Employeevà sau đó thêm một phương thức được gọi là validate() như hình dưới đây trong Employee.javatập tin. Đảm bảo rằng lớp hành động của bạn mở rộngActionSupport lớp, nếu không phương thức xác thực của bạn sẽ không được thực thi.
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport {
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void validate() {
if (name == null || name.trim().equals("")) {
addFieldError("name","The name is required");
}
if (age < 28 || age > 65) {
addFieldError("age","Age must be in between 28 and 65");
}
}
}
Như được hiển thị trong ví dụ trên, phương thức xác thực sẽ kiểm tra xem trường 'Tên' có giá trị hay không. Nếu không có giá trị nào được cung cấp, chúng tôi sẽ thêm lỗi trường cho trường 'Tên' với thông báo lỗi tùy chỉnh. Thứ hai, chúng tôi kiểm tra xem giá trị đã nhập cho trường 'Tuổi' có nằm trong khoảng từ 28 đến 65 hay không, nếu điều kiện này không đáp ứng, chúng tôi sẽ thêm lỗi phía trên trường đã xác thực.
Tệp cấu hình
Cuối cùng, chúng ta hãy kết hợp mọi thứ lại với nhau bằng cách sử dụng struts.xml tập tin cấu hình như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "empinfo"
class = "com.tutorialspoint.struts2.Employee"
method = "execute">
<result name = "input">/index.jsp</result>
<result name = "success">/success.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ không nhập bất kỳ thông tin cần thiết nào, chỉ cần nhấp vào Submitcái nút. Bạn sẽ thấy kết quả sau:
Nhập thông tin bắt buộc nhưng nhập sai trường Từ, hãy để chúng tôi nói tên là "kiểm tra" và tuổi là 30, và cuối cùng nhấp vào Submitcái nút. Bạn sẽ thấy kết quả sau:
Việc xác thực này hoạt động như thế nào?
Khi người dùng nhấn nút gửi, Struts 2 sẽ tự động thực thi phương thức xác thực và nếu có “if”các câu lệnh được liệt kê bên trong phương thức là true, Struts 2 sẽ gọi phương thức addFieldError của nó. Nếu bất kỳ lỗi nào đã được thêm vào, thì Struts 2 sẽ không tiến hành gọi phương thức thực thi. Thay vào đó, khuôn khổ Struts 2 sẽ trở lạiinput là kết quả của việc gọi hành động.
Do đó, khi xác thực không thành công và Struts 2 trả về input, khung công tác Struts 2 sẽ hiển thị lại tệp index.jsp. Vì chúng tôi đã sử dụng thẻ biểu mẫu Struts 2 nên Struts 2 sẽ tự động thêm các thông báo lỗi ngay phía trên biểu mẫu được lưu.
Những thông báo lỗi này là những thông báo chúng tôi đã chỉ định trong cuộc gọi phương thức addFieldError. Phương thức addFieldError nhận hai đối số. Đầu tiên, làform tên trường mà lỗi áp dụng và thứ hai, là thông báo lỗi hiển thị phía trên trường biểu mẫu đó.
addFieldError("name","The name is required");
Để xử lý giá trị trả về của input chúng tôi cần thêm kết quả sau vào nút hành động của chúng tôi trong struts.xml.
<result name = "input">/index.jsp</result>
Xác thực dựa trên XML
Phương pháp thứ hai để thực hiện xác thực là đặt một tệp xml bên cạnh lớp hành động. Xác thực dựa trên XML của Struts2 cung cấp nhiều tùy chọn xác thực hơn như xác thực email, xác thực phạm vi số nguyên, trường xác thực biểu mẫu, xác thực biểu thức, xác thực regex, xác thực yêu cầu, xác thực chuỗi yêu cầu, xác thực độ dài chuỗi, v.v.
Tệp xml cần được đặt tên '[action-class]'-validation.xml. Vì vậy, trong trường hợp của chúng tôi, chúng tôi tạo một tệp có tênEmployee-validation.xml với các nội dung sau -
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name = "name">
<field-validator type = "required">
<message>
The name is required.
</message>
</field-validator>
</field>
<field name = "age">
<field-validator type = "int">
<param name = "min">29</param>
<param name = "max">64</param>
<message>
Age must be in between 28 and 65
</message>
</field-validator>
</field>
</validators>
Tệp XML bên trên sẽ được lưu giữ lý tưởng trong CLASSPATH của bạn cùng với tệp lớp. Hãy để chúng tôi có lớp hành động Nhân viên của chúng tôi như sau mà không cầnvalidate() phương pháp -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Phần còn lại của thiết lập sẽ vẫn như ví dụ trước, bây giờ nếu bạn chạy ứng dụng, nó sẽ tạo ra kết quả giống như những gì chúng ta nhận được trong ví dụ trước.
Ưu điểm của việc có tệp xml để lưu trữ cấu hình cho phép tách xác thực khỏi mã ứng dụng. Bạn có thể nhờ một nhà phát triển viết mã và một nhà phân tích kinh doanh để tạo các tệp xml xác thực. Một điều khác cần lưu ý là các loại trình xác nhận có sẵn theo mặc định.
Có rất nhiều trình xác nhận khác đi kèm theo mặc định với Struts. Trình xác thực phổ biến bao gồm Trình xác thực ngày, Trình xác thực Regex và Trình xác thực độ dài chuỗi. Kiểm tra liên kết sau để biết thêm chi tiết Struts - Trình xác thực dựa trên XML .
Quốc tế hóa (i18n) là quá trình lập kế hoạch và thực hiện các sản phẩm và dịch vụ để chúng có thể dễ dàng thích ứng với các ngôn ngữ và văn hóa địa phương cụ thể, một quá trình được gọi là bản địa hóa. Quá trình quốc tế hóa được gọi là hỗ trợ dịch thuật hoặc bản địa hóa.
Quốc tế hóa được viết tắt i18n bởi vì từ bắt đầu bằng chữ cái “i” và kết thúc bằng “n”, và có 18 ký tự giữa i đầu tiên và n cuối cùng.
Struts2 cung cấp hỗ trợ bản địa hóa, tức là quốc tế hóa (i18n) thông qua các gói tài nguyên, bộ chặn và thư viện thẻ ở những nơi sau:
Thẻ giao diện người dùng
Tin nhắn và lỗi.
Trong các lớp hành động.
Gói tài nguyên
Struts2 sử dụng các gói tài nguyên để cung cấp nhiều tùy chọn ngôn ngữ và địa phương cho người dùng ứng dụng web. Bạn không cần phải lo lắng về việc viết các trang bằng các ngôn ngữ khác nhau. Tất cả những gì bạn phải làm là tạo một gói tài nguyên cho từng ngôn ngữ mà bạn muốn. Các gói tài nguyên sẽ chứa tiêu đề, thông báo và văn bản khác bằng ngôn ngữ của người dùng của bạn. Gói tài nguyên là tệp chứa các cặp khóa / giá trị cho ngôn ngữ mặc định của ứng dụng của bạn.
Định dạng đặt tên đơn giản nhất cho tệp tài nguyên là:
bundlename_language_country.properties
Đây, bundlenamecó thể là ActionClass, Interface, SuperClass, Model, Package, Global resource. Phần tiếp theolanguage_country đại diện cho ngôn ngữ quốc gia, ví dụ, ngôn ngữ Tây Ban Nha (Tây Ban Nha) được biểu thị bằng es_ES và ngôn ngữ tiếng Anh (Hoa Kỳ) được đại diện bằng en_US, v.v. nơi bạn có thể bỏ qua phần quốc gia là tùy chọn.
Khi bạn tham chiếu một phần tử thông báo bằng khóa của nó, khung Struts sẽ tìm kiếm một gói thông báo tương ứng theo thứ tự sau:
- ActionClass.properties
- Interface.properties
- SuperClass.properties
- model.properties
- package.properties
- struts.properties
- global.properties
Để phát triển ứng dụng của bạn bằng nhiều ngôn ngữ, bạn nên duy trì nhiều tệp thuộc tính tương ứng với các ngôn ngữ / địa phương đó và xác định tất cả nội dung theo các cặp khóa / giá trị.
Ví dụ: nếu bạn định phát triển ứng dụng của mình cho tiếng Anh Mỹ (Mặc định), tiếng Tây Ban Nha và tiếng Pháp, thì bạn sẽ phải tạo ba tệp thuộc tính. Ở đây tôi sẽ sử dụngglobal.properties chỉ tệp, bạn cũng có thể sử dụng các tệp thuộc tính khác nhau để tách các loại thông báo khác nhau.
global.properties - Theo mặc định tiếng Anh (Hoa Kỳ) sẽ được áp dụng
global_fr.properties - Điều này sẽ được sử dụng cho ngôn ngữ Franch.
global_es.properties - Điều này sẽ được sử dụng cho ngôn ngữ Tây Ban Nha.
Truy cập tin nhắn
Có một số cách để truy cập tài nguyên thông báo, bao gồm getText, thẻ văn bản, thuộc tính khóa của thẻ giao diện người dùng và thẻ i18n. Hãy để chúng tôi xem chúng một cách ngắn gọn -
Để hiển thị i18n nhắn tin, sử dụng cuộc gọi tới getText trong thẻ thuộc tính hoặc bất kỳ thẻ nào khác, chẳng hạn như các thẻ giao diện người dùng như sau:
<s:property value = "getText('some.key')" />
Các text tag lấy một thông báo từ gói tài nguyên mặc định, tức là, struts.properties
<s:text name = "some.key" />
Các i18n tagđẩy một gói tài nguyên tùy ý vào ngăn xếp giá trị. Các thẻ khác trong phạm vi của thẻ i18n có thể hiển thị thông báo từ gói tài nguyên đó−
<s:i18n name = "some.package.bundle">
<s:text name = "some.key" />
</s:i18n>
Các key thuộc tính của hầu hết các thẻ giao diện người dùng có thể được sử dụng để tạo thông báo từ một gói tài nguyên -
<s:textfield key = "some.key" name = "textfieldName"/>
Ví dụ về bản địa hóa
Hãy để chúng tôi nhắm mục tiêu để tạo index.jsptừ chương trước bằng nhiều ngôn ngữ. Tệp tương tự sẽ được viết như sau:
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form with Multilingual Support</title>
</head>
<body>
<h1><s:text name = "global.heading"/></h1>
<s:url id = "indexEN" namespace="/" action = "locale" >
<s:param name = "request_locale" >en</s:param>
</s:url>
<s:url id = "indexES" namespace="/" action = "locale" >
<s:param name = "request_locale" >es</s:param>
</s:url>
<s:url id = "indexFR" namespace="/" action = "locale" >
<s:param name = "request_locale" >fr</s:param>
</s:url>
<s:a href="%{indexEN}" >English</s:a>
<s:a href="%{indexES}" >Spanish</s:a>
<s:a href="%{indexFR}" >France</s:a>
<s:form action = "empinfo" method = "post" namespace = "/">
<s:textfield name = "name" key = "global.name" size = "20" />
<s:textfield name = "age" key = "global.age" size = "20" />
<s:submit name = "submit" key = "global.submit" />
</s:form>
</body>
</html>
Chúng tôi sẽ tạo success.jsp tệp sẽ được gọi trong trường hợp trả về hành động đã xác định SUCCESS.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
<s:property value = "getText('global.success')" />
</body>
</html>
Ở đây chúng ta sẽ cần tạo hai hành động sau. (a) Hành động đầu tiên a để quản lý Ngôn ngữ và hiển thị cùng một tệp index.jsp với ngôn ngữ khác (b) Một hành động khác là chăm sóc chính biểu mẫu gửi. Cả hai hành động sẽ trả về THÀNH CÔNG, nhưng chúng tôi sẽ thực hiện các hành động khác nhau dựa trên các giá trị trả về vì mục đích của chúng tôi khác nhau đối với cả hai hành động
Hành động chăm sóc Locale
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Locale extends ActionSupport {
public String execute() {
return SUCCESS;
}
}
Hành động để gửi biểu mẫu
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Bây giờ chúng ta hãy tạo ba global.properties các tập tin và đưa vào CLASSPATH -
global.properties
global.name = Name
global.age = Age
global.submit = Submit
global.heading = Select Locale
global.success = Successfully authenticated
global_fr.properties
global.name = Nom d'utilisateur
global.age = l'âge
global.submit = Soumettre des
global.heading = Sé lectionnez Local
global.success = Authentifi é avec succès
global_es.properties
global.name = Nombre de usuario
global.age = Edad
global.submit = Presentar
global.heading = seleccionar la configuracion regional
global.success = Autenticado correctamente
Chúng tôi sẽ tạo ra struts.xml với hai hành động như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<constant name = "struts.custom.i18n.resources" value = "global" />
<package name = "helloworld" extends = "struts-default" namespace="/">
<action name = "empinfo"
class = "com.tutorialspoint.struts2.Employee"
method = "execute">
<result name = "input">/index.jsp</result>
<result name = "success">/success.jsp</result>
</action>
<action name = "locale"
class = "com.tutorialspoint.struts2.Locale"
method = "execute">
<result name = "success">/index.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ hãy chọn bất kỳ ngôn ngữ nào, giả sử chúng tôi chọn Spanish, nó sẽ hiển thị kết quả sau:
Bạn cũng có thể thử với tiếng Pháp. Cuối cùng, chúng ta hãy thử nhấp vàoSubmit khi chúng ta đang ở Ngôn ngữ Tây Ban Nha, nó sẽ hiển thị màn hình sau:
Xin chúc mừng, bây giờ bạn đã có một trang web đa ngôn ngữ, bạn có thể khởi chạy trang web của mình trên toàn cầu.
Mọi thứ trên một yêu cầu HTTP được coi là Stringtheo giao thức. Điều này bao gồm số, boolean, số nguyên, ngày tháng, số thập phân và mọi thứ khác. Tuy nhiên, trong lớp Struts, bạn có thể có các thuộc tính của bất kỳ kiểu dữ liệu nào.
Làm thế nào để Struts tự động phân phối các thuộc tính cho bạn?
Struts sử dụng nhiều loại bộ chuyển đổi dưới nắp để thực hiện việc nâng vật nặng.
Ví dụ: nếu bạn có thuộc tính số nguyên trong lớp Hành động của mình, Struts sẽ tự động chuyển đổi tham số yêu cầu thành thuộc tính số nguyên mà bạn không cần làm gì cả. Theo mặc định, Struts đi kèm với một số bộ chuyển đổi kiểu
Nếu bạn đang sử dụng bất kỳ bộ chuyển đổi nào được liệt kê bên dưới, thì bạn không có gì phải lo lắng về -
- Số nguyên, Pha nổi, Đôi, Thập phân
- Ngày và giờ
- Mảng và Bộ sưu tập
- Enumerations
- Boolean
- BigDecimal
Đôi khi bạn đang sử dụng kiểu dữ liệu của riêng mình, cần phải thêm các trình chuyển đổi của riêng bạn để giúp Struts biết cách chuyển đổi các giá trị đó trước khi hiển thị. Hãy xem xét lớp học POJO sauEnvironment.java.
package com.tutorialspoint.struts2;
public class Environment {
private String name;
public Environment(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Đây là một lớp rất đơn giản có một thuộc tính được gọi là name, vì vậy không có gì đặc biệt về lớp này. Hãy để chúng tôi tạo một lớp khác chứa thông tin về hệ thống -SystemDetails.java.
Với mục đích của bài tập này, tôi đã mã hóa Môi trường thành "Phát triển" và Hệ điều hành thành "Windows XP SP3".
Trong một dự án thời gian thực, bạn sẽ nhận được thông tin này từ cấu hình hệ thống.
Let us have the following action class −
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class SystemDetails extends ActionSupport {
private Environment environment = new Environment("Development");
private String operatingSystem = "Windows XP SP3";
public String execute() {
return SUCCESS;
}
public Environment getEnvironment() {
return environment;
}
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public String getOperatingSystem() {
return operatingSystem;
}
public void setOperatingSystem(String operatingSystem) {
this.operatingSystem = operatingSystem;
}
}
Next, let us create a simple JSP file System.jsp to display the Environment and the Operating System information.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>System Details</title>
</head>
<body>
Environment: <s:property value = "environment"/><br/>
Operating System:<s:property value = "operatingSystem"/>
</body>
</html>
Hãy để chúng tôi kết nối system.jsp và SystemDetails.java lớp cùng nhau sử dụng struts.xml.
Lớp SystemDetails có một phương thức execute () đơn giản trả về chuỗi "SUCCESS".
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "system"
class = "com.tutorialspoint.struts2.SystemDetails"
method = "execute">
<result name = "success">/System.jsp</result>
</action>
</package>
</struts>
Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR File để tạo tệp Chiến tranh.
Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat.
Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URL http://localhost:8080/HelloWorldStruts2/system.action. Điều này sẽ tạo ra màn hình sau:
Điều gì là sai với đầu ra ở trên? Struts biết cách hiển thị và chuyển đổi chuỗi "Windows XP SP3" và các kiểu dữ liệu cài sẵn khác, nhưng nó không biết phải làm gì với thuộc tính củaEnvironmentkiểu. Nó đơn giản được gọi làtoString() phương pháp trên lớp
Để giải quyết vấn đề này, bây giờ chúng ta hãy tạo và đăng ký một TypeConverter cho lớp Môi trường.
Tạo một lớp có tên EnvironmentConverter.java với những điều sau đây.
package com.tutorialspoint.struts2;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class EnvironmentConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class clazz) {
Environment env = new Environment(values[0]);
return env;
}
@Override
public String convertToString(Map context, Object value) {
Environment env = (Environment) value;
return env == null ? null : env.getName();
}
}
Các EnvironmentConverter mở rộng StrutsTypeConverter lớp và cho Struts biết cách chuyển đổi Môi trường thành Chuỗi và ngược lại bằng cách ghi đè hai phương thức là convertFromString() và convertToString().
Bây giờ chúng ta hãy đăng ký bộ chuyển đổi này trước khi chúng ta sử dụng nó trong ứng dụng của mình. Có hai cách để đăng ký một bộ chuyển đổi.
Nếu trình chuyển đổi chỉ được sử dụng trong một hành động cụ thể, thì bạn sẽ phải tạo một tệp thuộc tính cần được đặt tên là '[action-class]'converstion.properties.
Trong trường hợp của chúng tôi, chúng tôi tạo một tệp có tên SystemDetails-converstion.properties với mục đăng ký sau -
environment = com.tutorialspoint.struts2.EnvironmentConverter
Trong ví dụ trên, "môi trường" là tên của thuộc tính trong SystemDetails.java và chúng tôi đang yêu cầu Struts sử dụng EnvironmentConverter để chuyển đổi đến và từ tài sản này.
Tuy nhiên, chúng tôi sẽ không làm điều này, thay vào đó chúng tôi sẽ đăng ký bộ chuyển đổi này trên toàn cầu để nó có thể được sử dụng trong toàn bộ ứng dụng. Để thực hiện việc này, hãy tạo một tệp thuộc tính có tênxwork-conversion.properties bên trong WEBINF/classes thư mục với dòng sau
com.tutorialspoint.struts2.Environment = \
com.tutorialspoint.struts2.EnvironmentConverter
Điều này chỉ đơn giản là đăng ký bộ chuyển đổi trên toàn cầu, do đó Strutscó thể tự động thực hiện chuyển đổi mỗi khi nó gặp một đối tượng thuộc loại Môi trường. Bây giờ, nếu bạn biên dịch lại và chạy lại chương trình, thì bạn sẽ nhận được đầu ra tốt hơn như sau:
Rõ ràng, bây giờ kết quả sẽ tốt hơn có nghĩa là trình chuyển đổi Struts của chúng tôi đang hoạt động tốt.
Đây là cách bạn có thể tạo nhiều trình chuyển đổi và đăng ký chúng để sử dụng theo yêu cầu của bạn.
Trước khi bắt đầu hướng dẫn thực tế cho chương này, chúng ta hãy xem xét một số định nghĩa được đưa ra bởi https://struts.apache.org-
Sr.No | Thuật ngữ & Mô tả |
---|---|
1 | TAG Một đoạn mã nhỏ được thực thi từ bên trong JSP, FreeMarker hoặc Velocity. |
2 | TEMPLATE Một chút mã, thường được viết bằng FreeMarker, có thể được hiển thị bằng các thẻ nhất định (thẻ HTML). |
3 | THEME Một bộ sưu tập các mẫu được đóng gói cùng nhau để cung cấp chức năng chung. |
Tôi cũng khuyên bạn nên xem qua chương Bản địa hóa của Struts2 vì chúng ta sẽ lấy cùng một ví dụ một lần nữa để thực hiện bài tập của chúng ta.
Khi bạn sử dụng một Struts 2chẳng hạn như <s: submit ...>, <s: textfield ...> vv trong trang web của bạn, khung công tác Struts 2 tạo mã HTML với kiểu và bố cục được định cấu hình trước. Struts 2 đi kèm với ba chủ đề cài sẵn -
Sr.No | Chủ đề & Mô tả |
---|---|
1 | SIMPLE theme Một chủ đề tối thiểu không có "chuông và còi". Ví dụ: thẻ textfield hiển thị thẻ HTML <input /> mà không có nhãn, xác thực, báo cáo lỗi hoặc bất kỳ định dạng hoặc chức năng nào khác. |
2 | XHTML theme Đây là chủ đề mặc định được Struts 2 sử dụng và cung cấp tất cả những điều cơ bản mà chủ đề đơn giản cung cấp và thêm một số tính năng như bố cục bảng hai cột tiêu chuẩn cho HTML, Nhãn cho từng HTML, Xác thực và báo cáo lỗi, v.v. |
3 | CSS_XHTML theme Chủ đề này cung cấp tất cả những điều cơ bản mà chủ đề đơn giản cung cấp và thêm một số tính năng như bố cục dựa trên CSS hai cột tiêu chuẩn, sử dụng <div> cho Thẻ HTML Struts, Nhãn cho từng Thẻ HTML Struts, được đặt theo biểu định kiểu CSS . |
Như đã đề cập ở trên, nếu bạn không chỉ định chủ đề, thì Struts 2 sẽ sử dụng chủ đề xhtml theo mặc định. Ví dụ: thẻ chọn Struts 2 này -
<s:textfield name = "name" label = "Name" />
tạo đánh dấu HTML sau -
<tr>
<td class="tdLabel">
<label for = "empinfo_name" class="label">Name:</label>
</td>
<td>
<input type = "text" name = "name" value = "" id = "empinfo_name"/>
</td>
</tr>
Đây empinfo là tên hành động được định nghĩa trong tệp struts.xml.
Chọn chủ đề
Bạn có thể chỉ định chủ đề theo Struts 2, cơ sở thẻ hoặc bạn có thể sử dụng một trong các phương pháp sau để chỉ định chủ đề mà Struts 2 nên sử dụng:
Thuộc tính chủ đề trên thẻ cụ thể
Thuộc tính chủ đề trên thẻ biểu mẫu xung quanh của thẻ
Thuộc tính phạm vi trang có tên "chủ đề"
Thuộc tính phạm vi yêu cầu có tên "chủ đề"
Thuộc tính phạm vi phiên có tên "chủ đề"
Thuộc tính phạm vi ứng dụng có tên "chủ đề"
Thuộc tính struts.ui.theme trong struts.properties (mặc định là xhtml)
Sau đây là cú pháp để chỉ định chúng ở cấp thẻ nếu bạn muốn sử dụng các chủ đề khác nhau cho các thẻ khác nhau -
<s:textfield name = "name" label = "Name" theme="xhtml"/>
Bởi vì việc sử dụng các chủ đề trên mỗi thẻ là không thực tế lắm, vì vậy, chúng tôi chỉ cần chỉ định quy tắc trong struts.properties sử dụng các thẻ sau:
# Standard UI theme
struts.ui.theme = xhtml
# Directory where theme template resides
struts.ui.templateDir = template
# Sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix = ftl
Sau đây là kết quả chúng tôi chọn được từ chương bản địa hóa, nơi chúng tôi sử dụng chủ đề mặc định với một cài đặt struts.ui.theme = xhtml trong struts-default.properties tệp có sẵn theo mặc định trong tệp struts2-core.xy.z.jar.
Làm thế nào một chủ đề hoạt động?
Đối với một chủ đề nhất định, mỗi thẻ struts có một mẫu được liên kết như s:textfield → text.ftl và s:password → password.ftl Vân vân.
Các tệp mẫu này được nén trong tệp struts2-core.xy.z.jar. Các tệp mẫu này giữ bố cục HTML được xác định trước cho mỗi thẻ.
Bằng cách này, Struts 2 framework tạo mã đánh dấu HTML cuối cùng bằng cách sử dụng thẻ Sturts và các mẫu được liên kết.
Struts 2 tags + Associated template file = Final HTML markup code.
Các mẫu mặc định được viết bằng FreeMarker và chúng có phần mở rộng .ftl.
Bạn cũng có thể thiết kế các mẫu của mình bằng cách sử dụng tốc độ hoặc JSP và theo đó đặt cấu hình trong struts.properties bằng cách sử dụng struts.ui.templateSuffix và struts.ui.templateDir.
Tạo chủ đề mới
Cách đơn giản nhất để tạo chủ đề mới là sao chép bất kỳ tệp chủ đề / mẫu hiện có nào và thực hiện các sửa đổi cần thiết.
Hãy để chúng tôi bắt đầu với việc tạo một thư mục có tên templatetrong các lớp WebContent / WEBINF / và một thư mục con có tên chủ đề mới của chúng tôi. Ví dụ: WebContent / WEB-INF / class / template / mytheme .
Từ đây, bạn có thể bắt đầu xây dựng các mẫu từ đầu hoặc bạn cũng có thể sao chép các mẫu từ Struts2 distribution nơi bạn có thể sửa đổi chúng theo yêu cầu trong tương lai.
Chúng tôi sẽ sửa đổi mẫu mặc định hiện có xhtmlcho mục đích học tập. Bây giờ, chúng ta hãy sao chép nội dung từ struts2-core-xyzjar / template / xhtml vào thư mục chủ đề và chỉ sửa đổi tệp WebContent / WEBINF / class / template / mytheme / control .ftl. Khi chúng ta mở control.ftl sẽ có các dòng sau:
<table class="${parameters.cssClass?default('wwFormTable')?html}"<#rt/>
<#if parameters.cssStyle??> style="${parameters.cssStyle?html}"<#rt/>
</#if>
>
Hãy để chúng tôi thay đổi tệp trên control.ftl có nội dung sau -
<table style = "border:1px solid black;">
Nếu bạn sẽ kiểm tra form.ftl rồi bạn sẽ thấy rằng control.ftlđược sử dụng trong tệp này, nhưng form.ftl đang tham chiếu tệp này từ chủ đề xhtml. Vì vậy, hãy để chúng tôi thay đổi nó như sau:
<#include "/${parameters.templateDir}/xhtml/form-validate.ftl" />
<#include "/${parameters.templateDir}/simple/form-common.ftl" /> <#if (parameters.validate?default(false))> onreset = "${parameters.onreset?default('clearErrorMessages(this);\
clearErrorLabels(this);')}"
<#else>
<#if parameters.onreset??>
onreset="${parameters.onreset?html}" </#if> </#if> #include "/${parameters.templateDir}/mytheme/control.ftl" />
Tôi cho rằng, bạn sẽ không hiểu nhiều về FreeMarker ngôn ngữ mẫu, bạn vẫn có thể biết rõ những việc cần làm bằng cách xem các tệp .ftl.
Tuy nhiên, hãy để chúng tôi lưu các thay đổi ở trên và quay lại ví dụ bản địa hóa của chúng tôi và tạo WebContent/WEB-INF/classes/struts.properties tập tin với nội dung sau
# Customized them
struts.ui.theme = mytheme
# Directory where theme template resides
struts.ui.templateDir = template
# Sets the template type to ftl.
struts.ui.templateSuffix = ftl
Bây giờ sau khi thay đổi này, hãy nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2. Điều này sẽ tạo ra màn hình sau:
Bạn có thể thấy một đường viền xung quanh thành phần biểu mẫu là kết quả của sự thay đổi mà chúng tôi đã thực hiện trong chủ đề sau khi sao chép nó từ chủ đề xhtml. Nếu bạn bỏ chút công sức tìm hiểu FreeMarker, bạn sẽ có thể tạo hoặc sửa đổi các chủ đề của mình rất dễ dàng.
Tôi hy vọng rằng bây giờ bạn đã hiểu cơ bản về Sturts 2 chủ đề và mẫu, phải không?
Strutscung cấp một cách dễ dàng hơn để xử lý ngoại lệ không cần thiết và chuyển hướng người dùng đến trang lỗi chuyên dụng. Bạn có thể dễ dàng cấu hình Struts để có các trang lỗi khác nhau cho các trường hợp ngoại lệ khác nhau.
Struts giúp xử lý ngoại lệ dễ dàng bằng cách sử dụng bộ đánh chặn "ngoại lệ". Bộ đánh chặn "ngoại lệ" được bao gồm như một phần của ngăn xếp mặc định, vì vậy bạn không phải làm gì thêm để định cấu hình nó. Nó có sẵn bên ngoài hộp sẵn sàng cho bạn sử dụng.
Hãy để chúng tôi xem một ví dụ Hello World đơn giản với một số sửa đổi trong tệp HelloWorldAction.java. Ở đây, chúng tôi đã cố tình giới thiệu một Ngoại lệ NullPointer trongHelloWorldAction mã hành động.
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
private String name;
public String execute(){
String x = null;
x = x.substring(0);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Hãy để chúng tôi giữ nội dung của HelloWorld.jsp như sau -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
Sau đây là nội dung của index.jsp -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
Của bạn struts.xml nên trông giống như -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Bây giờ nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Nhập giá trị "Struts2" và gửi trang. Bạn sẽ thấy trang sau -
Như thể hiện trong ví dụ trên, bộ đánh chặn ngoại lệ mặc định thực hiện rất tốt việc xử lý ngoại lệ.
Bây giờ chúng ta hãy tạo một trang lỗi dành riêng cho Ngoại lệ của chúng ta. Tạo một tệp có tênError.jsp với các nội dung sau -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
This is my custom error page
</body>
</html>
Bây giờ chúng ta hãy cấu hình Struts để sử dụng trang lỗi này trong trường hợp ngoại lệ. Hãy để chúng tôi sửa đổistruts.xml như sau -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<exception-mapping exception = "java.lang.NullPointerException"
result = "error" />
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/Error.jsp</result>
</action>
</package>
</struts>
Như được hiển thị trong ví dụ trên, bây giờ chúng ta đã cấu hình Struts để sử dụng Error.jsp dành riêng cho NullPointerException. Nếu bạn chạy lại chương trình ngay bây giờ, bạn sẽ thấy kết quả sau:
Ngoài ra, Struts2 framework đi kèm với một bộ đánh chặn "ghi nhật ký" để ghi lại các ngoại lệ. Bằng cách cho phép trình ghi nhật ký các ngoại lệ chưa được ghi nhận, chúng tôi có thể dễ dàng xem xét dấu vết ngăn xếp và tìm ra lỗi
Ánh xạ ngoại lệ toàn cầu
Chúng tôi đã thấy cách chúng tôi có thể xử lý ngoại lệ hành động cụ thể. Chúng tôi có thể đặt một ngoại lệ trên toàn cầu sẽ áp dụng cho tất cả các hành động. Ví dụ: để bắt các ngoại lệ NullPointerException giống nhau, chúng ta có thể thêm<global-exception-mappings...> thẻ bên trong thẻ <package ...> và thẻ <result ...> của nó phải được thêm vào bên trong thẻ <action ...> trong tệp struts.xml như sau:
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<global-exception-mappings>
<exception-mapping exception = "java.lang.NullPointerException"
result = "error" />
</global-exception-mappings>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/Error.jsp</result>
</action>
</package>
</struts>
Như đã đề cập trước đây, Struts cung cấp hai dạng cấu hình. Cách truyền thống là sử dụngstruts.xmltệp cho tất cả các cấu hình. Chúng tôi đã thấy rất nhiều ví dụ về điều đó trong hướng dẫn cho đến nay. Cách khác để định cấu hình Struts là sử dụng tính năng Chú thích của Java 5. Sử dụng chú thích thanh chống, chúng ta có thể đạt đượcZero Configuration.
Để bắt đầu sử dụng chú thích trong dự án của bạn, hãy đảm bảo rằng bạn đã đưa các tệp jar sau vào WebContent/WEB-INF/lib thư mục -
- struts2-convention-plugin-x.y.z.jar
- asm-x.y.jar
- antlr-x.y.z.jar
- commons-fileupload-x.y.z.jar
- commons-io-x.y.z.jar
- commons-lang-x.y.jar
- commons-logging-x.y.z.jar
- commons-logging-api-x.y.jar
- freemarker-x.y.z.jar
- javassist-.xy.z.GA
- ognl-x.y.z.jar
- struts2-core-x.y.z.jar
- xwork-core.x.y.z.jar
Bây giờ, hãy để chúng tôi xem bạn có thể làm như thế nào với cấu hình có sẵn trong struts.xml và thay thế nó bằng các chú thích.
Để giải thích khái niệm Annotation trong Struts2, chúng ta sẽ phải xem xét lại ví dụ xác thực được giải thích trong chương Struts2 Validations .
Ở đây, chúng tôi sẽ lấy một ví dụ về một Nhân viên có tên, tuổi sẽ được ghi lại bằng cách sử dụng một trang đơn giản và chúng tôi sẽ đặt hai xác nhận để đảm bảo rằng ÜSER luôn nhập tên và tuổi phải từ 28 đến 65.
Chúng ta hãy bắt đầu với trang JSP chính của ví dụ.
Tạo trang chính
Hãy để chúng tôi viết tệp JSP trang chính index.jsp, được sử dụng để thu thập thông tin liên quan đến Nhân viên được đề cập ở trên.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form</title>
</head>
<body>
<s:form action = "empinfo" method = "post">
<s:textfield name = "name" label = "Name" size = "20" />
<s:textfield name = "age" label = "Age" size = "20" />
<s:submit name = "submit" label = "Submit" align="center" />
</s:form>
</body>
</html>
Index.jsp sử dụng thẻ Struts, mà chúng ta chưa đề cập đến nhưng chúng ta sẽ nghiên cứu chúng trong các chương liên quan đến thẻ. Nhưng hiện tại, chỉ cần giả sử rằng thẻ s: textfield in một trường đầu vào và s: submit in ra một nút gửi. Chúng tôi đã sử dụng thuộc tính nhãn cho mỗi thẻ để tạo nhãn cho mỗi thẻ.
Tạo chế độ xem
Chúng tôi sẽ sử dụng tệp JSP success.jsp sẽ được gọi trong trường hợp hành động đã xác định trả về SUCCESS.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
Employee Information is captured successfully.
</body>
</html>
Tạo hành động
Đây là nơi sử dụng chú thích. Hãy để chúng tôi xác định lại lớp hành độngEmployee với chú thích, sau đó thêm một phương thức được gọi là validate () như hình dưới đây trong Employee.javatập tin. Đảm bảo rằng lớp hành động của bạn mở rộngActionSupport lớp, nếu không phương thức xác thực của bạn sẽ không được thực thi.
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.validator.annotations.*;
@Results({
@Result(name = "success", Location = "/success.jsp"),
@Result(name = "input", Location = "/index.jsp")
})
public class Employee extends ActionSupport {
private String name;
private int age;
@Action(value = "/empinfo")
public String execute() {
return SUCCESS;
}
@RequiredFieldValidator( message = "The name is required" )
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@IntRangeFieldValidator(message = "Age must be in between 28 and 65", min = "29", max = "65")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Chúng tôi đã sử dụng một vài chú thích trong ví dụ này. Hãy để tôi xem qua từng cái một -
Đầu tiên, chúng tôi đã bao gồm Resultschú thích. Chú thích Kết quả là một tập hợp các kết quả.
Dưới chú thích kết quả, chúng tôi có hai chú thích kết quả. Các chú thích kết quả cónametương ứng với kết quả của phương thức thực thi. Chúng cũng chứa một vị trí mà chế độ xem sẽ được phân phát tương ứng với giá trị trả về từ execute ()
Chú thích tiếp theo là Actionchú thích. Điều này được sử dụng để trang trí cho phương thức execute (). Phương thức Hành động cũng nhận một giá trị là URL mà hành động được gọi.
Cuối cùng, tôi đã sử dụng hai validationchú thích. Tôi đã định cấu hình trình xác thực trường bắt buộc trênname trường và trình xác thực phạm vi số nguyên trên agecánh đồng. Tôi cũng đã chỉ định một thông báo tùy chỉnh để xác nhận.
Tệp cấu hình
Chúng tôi thực sự không cần struts.xml tệp cấu hình, vì vậy hãy để chúng tôi xóa tệp này và để chúng tôi kiểm tra nội dung của web.xml tập tin -
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ không nhập bất kỳ thông tin cần thiết nào, chỉ cần nhấp vào Submitcái nút. Bạn sẽ thấy kết quả sau:
Nhập thông tin bắt buộc nhưng nhập sai trường Từ, hãy để chúng tôi nói tên là "kiểm tra" và tuổi là 30, và cuối cùng nhấp vào Submitcái nút. Bạn sẽ thấy kết quả sau:
Struts 2 Loại chú thích
Các ứng dụng Struts 2 có thể sử dụng các chú thích Java 5 như một sự thay thế cho cấu hình thuộc tính XML và Java. Bạn có thể kiểm tra danh sách các chú thích quan trọng nhất liên quan đến các danh mục khác nhau -
Struts 2 Loại chú thích .
Các thẻ Struts 2 có một tập hợp các thẻ giúp bạn dễ dàng kiểm soát luồng thực thi trang.
Sau đây là danh sách các Thẻ điều khiển Struts 2 quan trọng:
Thẻ If và Else
Các thẻ này thực hiện luồng điều kiện cơ bản được tìm thấy trong mọi ngôn ngữ.
'If' thẻ được sử dụng bởi chính nó hoặc với 'Else If' Gắn thẻ và / hoặc đơn / nhiều 'Else' Tag như hình bên dưới -
<s:if test = "%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test = "%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
Kiểm tra ví dụ chi tiết
Các thẻ lặp lại
Điều này iteratorsẽ lặp qua một giá trị. Giá trị có thể lặp lại có thể là tệp itherjava.util.Collection hoặc java.util.Iterator. Trong khi lặp qua trình lặp, bạn có thể sử dụngSort thẻ để sắp xếp kết quả hoặc SubSet để lấy một tập hợp con của danh sách hoặc mảng.
Ví dụ sau lấy giá trị của phương thức getDays () của đối tượng hiện tại trên ngăn xếp giá trị và sử dụng nó để lặp lại.
Thẻ <s: property /> in ra giá trị hiện tại của trình lặp.
<s:iterator value = "days">
<p>day is: <s:property/></p>
</s:iterator>
Kiểm tra ví dụ chi tiết
Thẻ hợp nhất
Những merge thẻ lấy hai hoặc nhiều danh sách làm tham số và hợp nhất tất cả chúng lại với nhau như được hiển thị bên dưới -
<s:merge var = "myMergedIterator">
<s:param value = "%{myList1}" />
<s:param value = "%{myList2}" />
<s:param value = "%{myList3}" />
</s:merge>
<s:iterator value = "%{#myMergedIterator}">
<s:property />
</s:iterator>
Kiểm tra ví dụ chi tiết
Thẻ nối
Những append thẻ lấy hai hoặc nhiều danh sách làm tham số và nối tất cả chúng lại với nhau như được hiển thị bên dưới -
<s:append var = "myAppendIterator">
<s:param value = "%{myList1}" />
<s:param value = "%{myList2}" />
<s:param value = "%{myList3}" />
</s:append>
<s:iterator value = "%{#myAppendIterator}">
<s:property />
</s:iterator>
Kiểm tra ví dụ chi tiết
Thẻ máy phát điện
Những generatorthẻ tạo một trình lặp dựa trên thuộc tính val được cung cấp. Thẻ trình tạo sau tạo một trình lặp và in nó ra bằng thẻ trình lặp.
<s:generator val = "%{'aaa,bbb,ccc,ddd,eee'}">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
Kiểm tra ví dụ chi tiết
The Struts 2 data tagschủ yếu được sử dụng để thao tác dữ liệu được hiển thị trên một trang. Dưới đây là các thẻ dữ liệu quan trọng được liệt kê: <Bắt đầu tại đây>
Thẻ hành động
Thẻ này cho phép các nhà phát triển gọi các hành động trực tiếp từ một trang JSP bằng cách chỉ định tên hành động và một vùng tên tùy chọn. Nội dung nội dung của thẻ được sử dụng để hiển thị kết quả từ Hành động. Bất kỳ bộ xử lý kết quả nào được xác định cho hành động này trong struts.xml sẽ bị bỏ qua, trừ khi tham số executeResult được chỉ định.
<div>Tag to execute the action</div>
<br />
<s:action name = "actionTagAction" executeresult = "true" />
<br />
<div>To invokes special method in action class</div>
<br />
<s:action name = "actionTagAction!specialMethod" executeresult = "true" />
Kiểm tra ví dụ chi tiết
Thẻ bao gồm
Những include sẽ được sử dụng để bao gồm một tệp JSP trong một trang JSP khác.
<-- First Syntax -->
<s:include value = "myJsp.jsp" />
<-- Second Syntax -->
<s:include value = "myJsp.jsp">
<s:param name = "param1" value = "value2" />
<s:param name = "param2" value = "value2" />
</s:include>
<-- Third Syntax -->
<s:include value = "myJsp.jsp">
<s:param name = "param1">value1</s:param>
<s:param name = "param2">value2</s:param>
</s:include>
Kiểm tra ví dụ chi tiết
Thẻ đậu
Những beanthẻ khởi tạo một lớp phù hợp với đặc tả JavaBeans. Thẻ này có một phần thân có thể chứa một số phần tử Param để đặt bất kỳ phương thức đột biến nào trên lớp đó. Nếu thuộc tính var được đặt trên BeanTag, nó sẽ đặt bean khởi tạo vào Ngữ cảnh của ngăn xếp.
<s:bean name = "org.apache.struts2.util.Counter" var = "counter">
<s:param name = "first" value = "20"/>
<s:param name = "last" value = "25" />
</s:bean>
Kiểm tra ví dụ chi tiết
Thẻ ngày
Những datethẻ sẽ cho phép bạn định dạng Ngày một cách nhanh chóng và dễ dàng. Bạn có thể chỉ định một định dạng tùy chỉnh (ví dụ: "dd / MM / yyyy hh: mm"), bạn có thể tạo các ký hiệu dễ đọc (như "trong 2 giờ, 14 phút") hoặc bạn chỉ có thể quay lại định dạng được xác định trước với khóa 'struts.date.format' trong tệp thuộc tính của bạn.
<s:date name = "person.birthday" format = "dd/MM/yyyy" />
<s:date name = "person.birthday" format = "%{getText('some.i18n.key')}" />
<s:date name = "person.birthday" nice="true" />
<s:date name = "person.birthday" />
Kiểm tra ví dụ chi tiết
Thẻ thông số
Những paramthẻ có thể được sử dụng để tham số hóa các thẻ khác. Thẻ này có hai tham số sau.
name (Chuỗi) - tên của tham số
value (Đối tượng) - giá trị của tham số
<pre>
<ui:component>
<ui:param name = "key" value = "[0]"/>
<ui:param name = "value" value = "[1]"/>
<ui:param name = "context" value = "[2]"/>
</ui:component>
</pre>
Kiểm tra ví dụ chi tiết
Thẻ thuộc tính
Những property được sử dụng để lấy thuộc tính của một giá trị, giá trị này sẽ được đặt mặc định ở trên cùng của ngăn xếp nếu không có giá trị nào được chỉ định.
<s:push value = "myBean">
<!-- Example 1: -->
<s:property value = "myBeanProperty" />
<!-- Example 2: -->TextUtils
<s:property value = "myBeanProperty" default = "a default value" />
</s:push>
Kiểm tra ví dụ chi tiết
Thẻ đẩy
Những push được sử dụng để đẩy giá trị lên ngăn xếp để sử dụng đơn giản hơn.
<s:push value = "user">
<s:propery value = "firstName" />
<s:propery value = "lastName" />
</s:push>
Kiểm tra ví dụ chi tiết
Thẻ đặt
Những setthẻ gán giá trị cho một biến trong phạm vi được chỉ định. Nó hữu ích khi bạn muốn gán một biến cho một biểu thức phức tạp và sau đó chỉ cần tham chiếu đến biến đó mỗi lần thay vì biểu thức phức tạp. Các phạm vi có sẵn làapplication, session, request, page và action.
<s:set name = "myenv" value = "environment.name"/>
<s:property value = "myenv"/>
Kiểm tra ví dụ chi tiết
Thẻ văn bản
Những text được sử dụng để hiển thị tin nhắn văn bản I18n.
<!-- First Example -->
<s:i18n name = "struts.action.test.i18n.Shop">
<s:text name = "main.title"/>
</s:i18n>
<!-- Second Example -->
<s:text name = "main.title" />
<!-- Third Examlpe -->
<s:text name = "i18n.label.greetings">
<s:param >Mr Smith</s:param>
</s:text>
Kiểm tra ví dụ chi tiết
Thẻ URL
Những url được sử dụng để tạo một URL.
<-- Example 1 -->
<s:url value = "editGadget.action">
<s:param name = "id" value = "%{selected}" />
</s:url>
<-- Example 2 -->
<s:url action = "editGadget">
<s:param name = "id" value = "%{selected}" />
</s:url>
<-- Example 3-->
<s:url includeParams="get">
<s:param name = "id" value = "%{'22'}" />
</s:url>
Kiểm tra ví dụ chi tiết
Danh sách của formthẻ là một tập hợp con của Thẻ giao diện người dùng Struts. Các thẻ này giúp kết xuất giao diện người dùng cần thiết cho các ứng dụng web Struts và có thể được phân loại thành ba loại. Chương này sẽ cung cấp cho bạn cả ba loại thẻ giao diện người dùng -
Thẻ giao diện người dùng đơn giản
Chúng tôi đã sử dụng các thẻ này trong các ví dụ của chúng tôi, chúng tôi sẽ xóa chúng trong chương này. Hãy để chúng tôi xem một trang xem đơn giảnemail.jsp với một số thẻ giao diện người dùng đơn giản -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<s:head/>
<title>Hello World</title>
</head>
<body>
<s:div>Email Form</s:div>
<s:text name = "Please fill in the form below:" />
<s:form action = "hello" method = "post" enctype = "multipart/form-data">
<s:hidden name = "secret" value = "abracadabra"/>
<s:textfield key = "email.from" name = "from" />
<s:password key = "email.password" name = "password" />
<s:textfield key = "email.to" name = "to" />
<s:textfield key = "email.subject" name = "subject" />
<s:textarea key = "email.body" name = "email.body" />
<s:label for = "attachment" value = "Attachment"/>
<s:file name = "attachment" accept = "text/html,text/plain" />
<s:token />
<s:submit key = "submit" />
</s:form>
</body>
</html>
Nếu bạn biết về HTML, thì tất cả các thẻ được sử dụng là các thẻ HTML rất phổ biến với một tiền tố bổ sung s:cùng với mỗi thẻ và các thuộc tính khác nhau. Khi chúng tôi thực hiện chương trình trên, chúng tôi sẽ nhận được giao diện người dùng sau với điều kiện bạn đã thiết lập ánh xạ thích hợp cho tất cả các khóa được sử dụng.
Như được minh họa, s: head tạo các phần tử javascript và biểu định kiểu cần thiết cho ứng dụng Struts2.
Tiếp theo, chúng ta có các phần tử s: div và s: text. S: div được sử dụng để hiển thị một phần tử Div HTML. Điều này rất hữu ích cho những người không thích kết hợp các thẻ HTML và Struts với nhau. Đối với những người đó, họ có quyền lựa chọn sử dụng s: div để hiển thị một div.
S: text như hình được sử dụng để hiển thị văn bản trên màn hình.
Tiếp theo chúng ta có thẻ famiilar s: form. Thẻ s: form có thuộc tính action xác định nơi gửi biểu mẫu. Bởi vì chúng tôi có một phần tử tải lên tệp trong biểu mẫu, chúng tôi phải đặt enctype thành nhiều phần. Nếu không, chúng ta có thể để trống.
Ở cuối thẻ biểu mẫu, chúng ta có thẻ s: submit. Điều này được sử dụng để gửi biểu mẫu. Khi biểu mẫu được gửi, tất cả các giá trị biểu mẫu được gửi tới hành động được chỉ định trong thẻ s: form.
Bên trong s: form, chúng ta có một thuộc tính ẩn gọi là secret. Điều này hiển thị một phần tử ẩn trong HTML. Trong trường hợp của chúng ta, phần tử "bí mật" có giá trị "abracadabra". Phần tử này không hiển thị cho người dùng cuối và được sử dụng để chuyển trạng thái từ chế độ xem này sang chế độ xem khác.
Tiếp theo chúng ta có các thẻ s: label, s: textfield, s: password và s: textarea. Chúng được sử dụng để hiển thị nhãn, trường nhập, mật khẩu và vùng văn bản tương ứng. Chúng tôi đã thấy những điều này hoạt động trong ví dụ "Struts - Sending Email".
Điều quan trọng cần lưu ý ở đây là việc sử dụng thuộc tính "key". Thuộc tính "key" được sử dụng để tìm nạp nhãn cho các điều khiển này từ tệp thuộc tính. Chúng tôi đã đề cập đến tính năng này trong chương Bản địa hóa, quốc tế hóa của Struts2.
Sau đó, chúng ta có thẻ s: file hiển thị thành phần tải lên tệp đầu vào. Thành phần này cho phép người dùng tải tệp lên. Trong ví dụ này, chúng tôi đã sử dụng tham số "accept" của thẻ s: file để chỉ định loại tệp nào được phép tải lên.
Cuối cùng chúng ta có thẻ s: token. Thẻ mã thông báo tạo mã thông báo duy nhất được sử dụng để tìm hiểu xem biểu mẫu đã được gửi hai lần hay chưa
Khi biểu mẫu được hiển thị, một biến ẩn được đặt làm giá trị mã thông báo. Ví dụ, chúng ta hãy nói rằng mã thông báo là "ABC". Khi biểu mẫu này được gửi, Struts Fitler sẽ kiểm tra mã thông báo so với mã thông báo được lưu trữ trong phiên. Nếu khớp, nó sẽ xóa mã thông báo khỏi phiên. Bây giờ, nếu biểu mẫu vô tình được gửi lại (bằng cách làm mới hoặc bằng cách nhấn nút quay lại của trình duyệt), biểu mẫu sẽ được gửi lại với "ABC" làm mã thông báo. Trong trường hợp này, bộ lọc sẽ kiểm tra lại mã thông báo so với mã thông báo được lưu trữ trong phiên. Nhưng vì mã thông báo "ABC" đã bị xóa khỏi phiên, nó sẽ không khớp và bộ lọc Struts sẽ từ chối yêu cầu.
Thẻ giao diện người dùng nhóm
Các thẻ giao diện người dùng nhóm được sử dụng để tạo nút radio và hộp kiểm. Hãy để chúng tôi xem một trang xem đơn giảnHelloWorld.jsp với hộp kiểm và thẻ nút radio -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action = "hello.action">
<s:radio label = "Gender" name = "gender" list="{'male','female'}" />
<s:checkboxlist label = "Hobbies" name = "hobbies"
list = "{'sports','tv','shopping'}" />
</s:form>
</body>
</html>
Khi chúng ta thực hiện chương trình trên, đầu ra của chúng ta sẽ giống như sau:
Bây giờ chúng ta hãy xem xét ví dụ. Trong ví dụ đầu tiên, chúng tôi đang tạo một nút radio đơn giản với nhãn "Giới tính". Thuộc tính name là bắt buộc đối với thẻ nút radio, vì vậy chúng tôi chỉ định tên là "giới tính". Sau đó, chúng tôi cung cấp một danh sách cho giới tính. Danh sách được điền với các giá trị "nam" và "nữ". Do đó, trong đầu ra, chúng tôi nhận được một nút radio có hai giá trị trong đó.
Trong ví dụ thứ hai, chúng tôi đang tạo một danh sách hộp kiểm. Điều này là để thu thập sở thích của người dùng. Người dùng có thể có nhiều sở thích và do đó chúng tôi đang sử dụng hộp kiểm thay vì nút radio. Hộp kiểm có danh sách "thể thao", "TV" và "Mua sắm". Điều này trình bày các sở thích dưới dạng danh sách hộp kiểm.
Chọn thẻ giao diện người dùng
Hãy cùng chúng tôi khám phá các biến thể khác nhau của Thẻ chọn do Struts cung cấp. Hãy để chúng tôi xem một trang xem đơn giảnHelloWorld.jsp với các thẻ chọn -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action = "login.action">
<s:select name = "username" label = "Username"
list = "{'Mike','John','Smith'}" />
<s:select label = "Company Office" name = "mySelection"
value = "%{'America'}" list="%{#{'America':'America'}}">
<s:optgroup label = "Asia"
list = "%{#{'India':'India','China':'China'}}" />
<s:optgroup label = "Europe"
list="%{#{'UK':'UK','Sweden':'Sweden','Italy':'Italy'}}" />
</s:select>
<s:combobox label = "My Sign" name = "mySign"
list = "#{'aries':'aries','capricorn':'capricorn'}" headerkey = "-1"
headervalue = "--- Please Select ---" emptyOption = "true" value = "capricorn" />
<s:doubleselect label = "Occupation" name = "occupation"
list = "{'Technical','Other'}" doublename = "occupations2"
doubleList="top == 'Technical' ?
{'I.T', 'Hardware'} : {'Accounting', 'H.R'}" />
</s:form>
</body>
</html>
Khi chúng ta thực hiện chương trình trên, kết quả đầu ra của chúng ta sẽ giống như sau:
Bây giờ chúng ta hãy xem xét từng trường hợp một.
Đầu tiên, thẻ select hiển thị hộp chọn HTML. Trong ví dụ đầu tiên, chúng tôi đang tạo một hộp chọn đơn giản với tên "tên người dùng" và nhãn "tên người dùng". Hộp chọn sẽ được điền với một danh sách có tên Mike, John và Smith.
Trong ví dụ thứ hai, công ty của chúng tôi có trụ sở chính tại Mỹ. Nó cũng có các văn phòng toàn cầu ở Châu Á và Châu Âu. Chúng tôi muốn hiển thị các văn phòng trong một hộp chọn nhưng chúng tôi muốn nhóm các văn phòng toàn cầu theo tên của lục địa. Đây là lúc optgroup có ích. Chúng tôi sử dụng thẻ s: optgroup để tạo một nhóm mới. Chúng tôi cung cấp cho nhóm một nhãn và một danh sách riêng.
Trong ví dụ thứ ba, combobox được sử dụng. Hộp tổ hợp là sự kết hợp của trường nhập và hộp chọn. Người dùng có thể chọn một giá trị từ hộp chọn trong trường hợp này trường nhập tự động được điền với giá trị mà người dùng đã chọn. Nếu người dùng nhập trực tiếp giá trị, sẽ không có giá trị nào từ hộp chọn được chọn.
Trong ví dụ của chúng tôi, chúng tôi có hộp kết hợp liệt kê các dấu hiệu mặt trời. Hộp chọn chỉ liệt kê bốn mục nhập cho phép người dùng nhập dấu hiệu mặt trời của mình nếu nó không có trong danh sách. Chúng tôi cũng thêm một mục tiêu đề vào hộp chọn. Headerentry là cái được hiển thị ở trên cùng của hộp chọn. Trong trường hợp của chúng tôi, chúng tôi muốn hiển thị "Vui lòng chọn". Nếu người dùng không chọn bất kỳ thứ gì, thì chúng tôi giả sử -1 là giá trị. Trong một số trường hợp, chúng tôi không muốn người dùng chọn một giá trị trống. Trong những điều kiện đó, người ta sẽ đặt thuộc tính "blankOption" thành false. Cuối cùng, trong ví dụ của chúng tôi, chúng tôi cung cấp "capricorn" làm giá trị mặc định cho hộp kết hợp.
Trong ví dụ thứ tư, chúng ta có một lựa chọn kép. Lựa chọn kép được sử dụng khi bạn muốn hiển thị hai hộp chọn. Giá trị được chọn trong hộp chọn đầu tiên xác định giá trị xuất hiện trong hộp chọn thứ hai. Trong ví dụ của chúng tôi, hộp chọn đầu tiên hiển thị "Kỹ thuật" và "Khác". Nếu người dùng chọn Kỹ thuật, chúng tôi sẽ hiển thị CNTT và Phần cứng trong hộp chọn thứ hai. Nếu không, chúng tôi sẽ hiển thị Kế toán và Nhân sự. Điều này có thể thực hiện được bằng cách sử dụng các thuộc tính "list" và "doubleList" như được hiển thị trong ví dụ.
Trong ví dụ trên, chúng tôi đã so sánh để xem hộp chọn trên cùng có bằng Kỹ thuật hay không. Nếu có, thì chúng tôi hiển thị CNTT và Phần cứng.
Chúng ta cũng cần đặt tên cho hộp trên cùng ("name = 'Occupations') và hộp dưới cùng (doubleName = 'Occupations2')
Struts sử dụng khung DOJO để triển khai thẻ AJAX. Trước hết, để tiếp tục với ví dụ này, bạn cần thêm struts2-dojo-plugin-2.2.3.jar vào classpath của mình.
Bạn có thể lấy tệp này từ thư mục lib trong tệp tải xuống struts2 của bạn (C: \ struts-2.2.3all \ struts-2.2.3 \ lib \ struts2-dojo-plugin-2.2.3.jar)
Đối với vấn đề này, hãy để chúng tôi sửa đổi HelloWorld.jsp như sau -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<%@ taglib prefix = "sx" uri = "/struts-dojo-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
<sx:head />
</head>
<body>
<s:form>
<sx:autocompleter label = "Favourite Colour"
list = "{'red','green','blue'}" />
<br />
<sx:datetimepicker name = "deliverydate" label = "Delivery Date"
displayformat = "dd/MM/yyyy" />
<br />
<s:url id = "url" value = "/hello.action" />
<sx:div href="%{#url}" delay="2000">
Initial Content
</sx:div>
<br/>
<sx:tabbedpanel id = "tabContainer">
<sx:div label = "Tab 1">Tab 1</sx:div>
<sx:div label = "Tab 2">Tab 2</sx:div>
</sx:tabbedpanel>
</s:form>
</body>
</html>
Khi chúng ta chạy ví dụ trên, chúng ta nhận được kết quả sau:
Bây giờ chúng ta hãy xem qua ví dụ này từng bước một.
Điều đầu tiên cần chú ý là việc bổ sung một thư viện thẻ mới với tiền tố sx. Đây (struts-dojo-tags) là thư viện thẻ được tạo riêng cho tích hợp ajax.
Sau đó, bên trong phần đầu HTML, chúng tôi gọi là phần đầu sx:. Điều này khởi tạo khung dojo và làm cho nó sẵn sàng cho tất cả các lệnh gọi AJAX trong trang. Bước này rất quan trọng - các lệnh gọi ajax của bạn sẽ không hoạt động nếu không khởi tạo sx: head.
Đầu tiên, chúng tôi có thẻ tự động hoàn thành. Thẻ tự động hoàn thành trông khá giống một hộp chọn. Nó được điền với các giá trị đỏ, lục và lam. Nhưng sự khác biệt giữa hộp chọn và hộp này là nó tự động hoàn thành. Tức là, nếu bạn bắt đầu nhập vào gr, nó sẽ điền vào nó bằng "xanh". Ngoài ra, thẻ này rất giống với thẻ s: select mà chúng ta đã đề cập trước đó.
Tiếp theo, chúng tôi có một bộ chọn thời gian ngày. Thẻ này tạo một trường đầu vào với một nút bên cạnh nó. Khi nhấn nút, bộ chọn ngày giờ bật lên sẽ hiển thị. Khi người dùng chọn một ngày, ngày đó sẽ được điền vào văn bản đầu vào ở định dạng được chỉ định trong thuộc tính thẻ. Trong ví dụ của chúng tôi, chúng tôi đã chỉ định dd / MM / yyyy làm định dạng cho ngày.
Tiếp theo, chúng tôi tạo một thẻ url cho tệp system.action mà chúng tôi đã tạo trong các bài tập trước đó. Nó không nhất thiết phải là system.action - nó có thể là bất kỳ tệp hành động nào mà bạn đã tạo trước đó. Sau đó, chúng tôi có một div với siêu liên kết được đặt thành url và độ trễ được đặt thành 2 giây. Điều gì xảy ra khi bạn chạy điều này là, "Nội dung ban đầu" sẽ được hiển thị trong 2 giây, sau đó nội dung của div sẽ được thay thế bằng nội dung từhello.action chấp hành.
Cuối cùng chúng ta có một bảng tab đơn giản với hai tab. Các tab là các bảng chia với các nhãn Tab 1 và Tab2.
Cần lưu ý rằng tích hợp thẻ AJAX trong Struts vẫn đang trong quá trình hoàn thiện và sự phát triển của tích hợp này đang tăng dần theo mỗi bản phát hành.
Spring là một khung công tác web phổ biến cung cấp khả năng tích hợp dễ dàng với nhiều tác vụ web phổ biến. Vậy câu hỏi đặt ra là tại sao chúng ta cần Spring khi chúng ta có Struts2? Chà, Spring không chỉ là một khuôn khổ MVC - nó cung cấp nhiều tính năng bổ sung khác không có sẵn trong Struts.
Ví dụ: tiêm phụ thuộc có thể hữu ích cho bất kỳ khuôn khổ nào. Trong chương này, chúng ta sẽ đi qua một ví dụ đơn giản để xem cách tích hợp Spring và Struts2 với nhau.
Trước hết, bạn cần thêm các tệp sau vào đường dẫn xây dựng của dự án từ cài đặt Spring. Bạn có thể tải xuống và cài đặt phiên bản mới nhất của Spring Framework từhttps://www.springsource.org/download
- org.springframework.asm-x.y.z.M(a).jar
- org.springframework.beans-x.y.z.M(a).jar
- org.springframework.context-x.y.z.M(a).jar
- org.springframework.core-x.y.z.M(a).jar
- org.springframework.expression-x.y.z.M(a).jar
- org.springframework.web-x.y.z.M(a).jar
- org.springframework.web.servlet-x.y.z.M(a).jar
Cuối cùng thêm struts2-spring-plugin-x.y.z.jar trong của bạn WEB-INF/libtừ thư mục lib struts của bạn. Nếu bạn đang sử dụng Eclipse thì bạn có thể gặp phải ngoại lệ java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener .
Để khắc phục sự cố này, bạn phải vào Markervà nhấp chuột phải vào từng phụ thuộc lớp và thực hiện Sửa nhanh để xuất bản / xuất tất cả các phụ thuộc. Cuối cùng đảm bảo rằng không có xung đột phụ thuộc có sẵn trong tab đánh dấu.
Bây giờ hãy để chúng tôi thiết lập web.xml để tích hợp Struts-Spring như sau:
<?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"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Điều quan trọng cần lưu ý ở đây là trình nghe mà chúng ta đã cấu hình. CácContextLoaderListenerđược yêu cầu để tải tệp ngữ cảnh mùa xuân. Tệp cấu hình của Spring được gọi làapplicationContext.xml và nó phải được đặt ở cùng cấp với web.xml tập tin
Hãy để chúng tôi tạo một lớp hành động đơn giản có tên là User.java với hai thuộc tính - firstName và lastName.
package com.tutorialspoint.struts2;
public class User {
private String firstName;
private String lastName;
public String execute() {
return "success";
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Bây giờ chúng ta hãy tạo applicationContext.xml tệp cấu hình mùa xuân và khởi tạo User.javalớp học. Như đã đề cập trước đó, tệp này phải nằm trong thư mục WEB-INF -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id = "userClass" class = "com.tutorialspoint.struts2.User">
<property name = "firstName" value = "Michael" />
<property name = "lastName" value = "Jackson" />
</bean>
</beans>
Như đã thấy ở trên, chúng tôi đã định cấu hình bean người dùng và chúng tôi đã chèn các giá trị Michael và Jacksonvào đậu. Chúng tôi cũng đã đặt tên bean này là "userClass", để chúng tôi có thể sử dụng lại nó ở những nơi khác. Tiếp theo, chúng ta hãy tạoUser.jsp trong thư mục WebContent -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2 - Spring integration</h1>
<s:form>
<s:textfield name = "firstName" label = "First Name"/><br/>
<s:textfield name = "lastName" label = "Last Name"/><br/>
</s:form>
</body>
</html>
Các User.jsptệp khá thẳng về phía trước. Nó chỉ phục vụ một mục đích - để hiển thị các giá trị của họ và tên của đối tượng người dùng. Cuối cùng, hãy để tất cả các thực thể lại với nhau bằng cách sử dụngstruts.xml tập tin.
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "user" class="userClass"
method = "execute">
<result name = "success">/User.jsp</result>
</action>
</package>
</struts>
Điều quan trọng cần lưu ý là chúng tôi đang sử dụng id userClassđể tham khảo lớp học. Điều này có nghĩa là chúng ta đang sử dụng spring để thực hiện việc tiêm phụ thuộc cho lớp Người dùng.
Bây giờ nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/User.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ chúng tôi đã thấy làm thế nào để mang hai khuôn khổ lớn lại với nhau. Phần này kết thúc chương tích hợp Struts - Spring.
Trong chương này, chúng ta hãy xem xét các bước liên quan đến việc tích hợp khung công tác Tiles với Struts2. Apache Tiles là một khuôn khổ tạo mẫu được xây dựng để đơn giản hóa việc phát triển giao diện người dùng ứng dụng web.
Trước hết, chúng ta cần tải xuống các tệp jar gạch từ trang web Apache Tiles . Bạn cần thêm các tệp jar sau vào đường dẫn lớp của dự án.
- tiles-api-x.y.z.jar
- tiles-compat-x.y.z.jar
- tiles-core-x.y.z.jar
- tiles-jsp-x.y.z.jar
- tiles-servlet-x.y.z.jar
Ngoài những thứ trên, chúng tôi phải sao chép các tệp jar sau từ tệp tải xuống struts2 trong WEB-INF/lib.
- commons-beanutils-x.y.zjar
- commons-digester-x.y.jar
- struts2-tiles-plugin-x.y.z.jar
Bây giờ hãy để chúng tôi thiết lập web.xmlđể tích hợp Struts-Tiles như được đưa ra bên dưới. Có hai điểm quan trọng cần lưu ý ở đây. Trước tiên, chúng ta cần cho biết các ô, tìm tệp cấu hình ô ở đâutiles.xml. Trong trường hợp của chúng tôi, nó sẽ nằm dưới/WEB-INFthư mục. Tiếp theo, chúng ta cần khởi chạy trình nghe Tiles đi kèm với tải xuống Struts2.
<?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_2_5.xsd"
id = "WebApp_ID" version = "2.5">
<display-name>Struts2Example15</display-name>
<context-param>
<param-name>
org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
</param-name>
<param-value>
/WEB-INF/tiles.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Tiếp theo hãy để chúng tôi tạo tiles.xml trong thư mục / WEB-INF với nội dung sau:
<?xml version = "1.0" Encoding = "UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name = "baseLayout" template="/baseLayout.jsp">
<put-attribute name = "title" value = "Template"/>
<put-attribute name = "banner" value = "/banner.jsp"/>
<put-attribute name = "menu" value = "/menu.jsp"/>
<put-attribute name = "body" value = "/body.jsp"/>
<put-attribute name = "footer" value = "/footer.jsp"/>
</definition>
<definition name = "tiger" extends = "baseLayout">
<put-attribute name = "title" value = "Tiger"/>
<put-attribute name = "body" value = "/tiger.jsp"/>
</definition>
<definition name = "lion" extends = "baseLayout">
<put-attribute name = "title" value = "Lion"/>
<put-attribute name = "body" value = "/lion.jsp"/>
</definition>
</tiles-definitions>
Tiếp theo, chúng tôi xác định bố cục khung cơ bản trong baseLayout.jsp. Nó có năm khu vực có thể tái sử dụng / ghi đè. Cụ thểtitle, banner, menu, body và footer. Chúng tôi cung cấp các giá trị mặc định cho baseLayout và sau đó chúng tôi tạo hai tùy chỉnh mở rộng từ bố cục mặc định. Bố cục con hổ tương tự như bố cục cơ bản, ngoại trừ nó sử dụngtiger.jspnhư phần thân của nó và dòng chữ "Tiger" làm tiêu đề. Tương tự, bố cục sư tử tương tự như bố cục cơ bản, ngoại trừ nó sử dụnglion.jsp làm phần thân của nó và dòng chữ "Lion" làm tiêu đề.
Hãy để chúng tôi xem xét các tệp jsp riêng lẻ. Sau đây là nội dung củabaseLayout.jsp tập tin -
<%@ taglib uri = "http://tiles.apache.org/tags-tiles" prefix = "tiles"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset = UTF-8">
<title>
<tiles:insertAttribute name = "title" ignore="true" />
</title>
</head>
<body>
<tiles:insertAttribute name = "banner" /><br/>
<hr/>
<tiles:insertAttribute name = "menu" /><br/>
<hr/>
<tiles:insertAttribute name = "body" /><br/>
<hr/>
<tiles:insertAttribute name = "footer" /><br/>
</body>
</html>
Ở đây, chúng tôi chỉ tập hợp một trang HTML cơ bản có các thuộc tính xếp. Chúng tôi chèn các thuộc tính gạch vào những vị trí mà chúng tôi cần. Tiếp theo, hãy để chúng tôi tạobanner.jsp tệp với nội dung sau:
<img src="http://www.tutorialspoint.com/images/tp-logo.gif"/>
Các menu.jsp tệp sẽ có các dòng sau là các liên kết - đến các hành động của TigerMenu.action và LionMenu.action struts.
<%@taglib uri = "/struts-tags" prefix = "s"%>
<a href = "<s:url action = "tigerMenu"/>" Tiger</a><br>
<a href = "<s:url action = "lionMenu"/>" Lion</a><br>
Các lion.jsp tệp sẽ có nội dung sau:
<img src="http://upload.wikimedia.org/wikipedia/commons/d/d2/Lion.jpg"/>
The lion
Các tiger.jsp tệp sẽ có nội dung sau:
<img src="http://www.freewebs.com/tigerofdarts/tiger.jpg"/>
The tiger
Tiếp theo, hãy để chúng tôi tạo tệp lớp hành động MenuAction.java trong đó có những thứ sau -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class MenuAction extends ActionSupport {
public String tiger() { return "tiger"; }
public String lion() { return "lion"; }
}
Đây là một lớp khá thẳng tiến. Chúng tôi đã khai báo hai phương thức tiger () và lion () trả về kết quả tương ứng là tiger và lion. Hãy để chúng tôi tập hợp tất cả lại với nhau trongstruts.xml tập tin -
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name = "default" extends = "struts-default">
<result-types>
<result-type name = "tiles"
class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>
<action name = "*Menu" method = "{1}"
class = "com.tutorialspoint.struts2.MenuAction">
<result name = "tiger" type = "tiles">tiger</result>
<result name = "lion" type = "tiles">lion</result>
</action>
</package>
</struts>
Hãy để chúng tôi kiểm tra những gì chúng tôi đã làm trong tệp ở trên. Trước hết, chúng tôi đã khai báo một loại kết quả mới được gọi là "gạch" vì chúng tôi hiện đang sử dụng các ô thay vì jsp đơn giản cho công nghệ chế độ xem. Struts2 có hỗ trợ cho kiểu kết quả Tiles View, vì vậy chúng tôi tạo kiểu kết quả "gạch" thuộc lớp "org.apache.struts2.view.tiles.TilesResult".
Tiếp theo, chúng tôi muốn nói nếu yêu cầu dành cho /tigerMenu.action đưa người dùng đến trang xếp hổ và nếu yêu cầu dành cho /lionMenu.action đưa người dùng đến trang xếp hình sư tử.
Chúng tôi đạt được điều này bằng cách sử dụng một chút biểu thức chính quy. Trong định nghĩa hành động của chúng tôi, chúng tôi nói rằng bất kỳ thứ gì phù hợp với mẫu "* Menu" sẽ được xử lý bởi hành động này. Phương thức so khớp sẽ được gọi trong lớp MenuAction. Nghĩa là, tigerMenu.action sẽ gọi tiger () và lionMenu.action sẽ gọi ra lion (). Sau đó, chúng ta cần ánh xạ kết quả của kết quả đến các trang gạch thích hợp.
Bây giờ nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/tigerMenu.jsp. Điều này sẽ tạo ra màn hình sau:
Tương tự, nếu bạn truy cập trang lionMenu.action, bạn sẽ thấy trang sư tử sử dụng cùng một bố cục gạch.
Hibernate là dịch vụ truy vấn và tồn tại đối tượng / quan hệ hiệu suất cao được cấp phép theo Giấy phép Công cộng GNU Ít hơn (LGPL) nguồn mở và miễn phí tải xuống. Trong chương này. chúng ta sẽ tìm hiểu cách tích hợp Struts 2 với Hibernate. Nếu bạn chưa quen với Hibernate, thì bạn có thể xem hướng dẫn Hibernate của chúng tôi .
Thiết lập cơ sở dữ liệu
Đối với hướng dẫn này, tôi sẽ sử dụng cơ sở dữ liệu MySQL "struts2_tutorial". Tôi kết nối với cơ sở dữ liệu này trên máy của mình bằng tên người dùng "root" và không có mật khẩu. Trước hết, bạn cần chạy đoạn mã sau. Tập lệnh này tạo một bảng mới có tênstudent và tạo một vài bản ghi trong bảng này -
CREATE TABLE IF NOT EXISTS `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(40) NOT NULL,
`last_name` varchar(40) NOT NULL,
`marks` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
--
-- Dumping data for table `student`
--
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
VALUES(1, 'George', 'Kane', 20);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
VALUES(2, 'Melissa', 'Michael', 91);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
VALUES(3, 'Jessica', 'Drake', 21);
Cấu hình ngủ đông
Tiếp theo, hãy tạo hibernate.cfg.xml, đây là tệp cấu hình của hibernate.
<?xml version = '1.0' encoding = 'utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.connection.driver_class">c
om.mysql.jdbc.Driver
</property>
<property name = "hibernate.connection.url">
jdbc:mysql://www.tutorialspoint.com/struts_tutorial
</property>
<property name = "hibernate.connection.username">root</property>
<property name = "hibernate.connection.password"></property>
<property name = "hibernate.connection.pool_size">10</property>
<property name = "show_sql">true</property>
<property name = "dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.hbm2ddl.auto">update</property>
<mapping class = "com.tutorialspoint.hibernate.Student" />
</session-factory>
</hibernate-configuration>
Hãy để chúng tôi xem qua tệp cấu hình ngủ đông. Đầu tiên, chúng tôi đã khai báo rằng chúng tôi đang sử dụng trình điều khiển MySQL. Sau đó, chúng tôi khai báo url jdbc để kết nối với cơ sở dữ liệu. Sau đó, chúng tôi đã khai báo tên người dùng, mật khẩu và kích thước nhóm của kết nối. Chúng tôi cũng chỉ ra rằng chúng tôi muốn thấy SQL trong tệp nhật ký bằng cách bật "show_sql" thành true. Vui lòng xem qua hướng dẫn ngủ đông để hiểu ý nghĩa của các thuộc tính này.
Cuối cùng, chúng tôi đặt lớp ánh xạ thành com.tutorialspoint.hibernate.Student mà chúng tôi sẽ tạo trong chương này.
Thiết lập môi trường
Tiếp theo, bạn cần rất nhiều lọ cho dự án này. Đính kèm là ảnh chụp màn hình danh sách đầy đủ các tệp JAR được yêu cầu -
Hầu hết các tệp JAR có thể được lấy như một phần của bản phân phối thanh chống của bạn. Nếu bạn đã cài đặt một máy chủ ứng dụng như glassfish, websphere hoặc jboss, thì bạn có thể lấy phần lớn các tệp jar còn lại từ thư mục lib của máy chủ ứng dụng. Nếu không, bạn có thể tải từng tệp xuống -
Các tệp jar Hibernate - Hibernate.org
Struts hibernate plugin - Struts hibernate plugin
Tệp JTA - Tệp JTA
Tệp Dom4j - Dom4j
tệp log4j - log4j
Phần còn lại của các tệp, bạn sẽ có thể lấy từ bản phân phối Struts2 của mình.
Lớp học ngủ đông
Bây giờ chúng ta hãy tạo các lớp java cần thiết để tích hợp ngủ đông. Sau đây là nội dung củaStudent.java -
package com.tutorialspoint.hibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue
private int id;
@Column(name = "last_name")
private String lastName;
@Column(name = "first_name")
private String firstName;
private int marks;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
}
Đây là một lớp POJO đại diện cho studentbảng theo đặc điểm kỹ thuật Hibernate. Nó có id thuộc tính, firstName và lastName tương ứng với tên cột của bảng sinh viên. Tiếp theo hãy để chúng tôi tạoStudentDAO.java tập tin như sau -
package com.tutorialspoint.hibernate;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.googlecode.s2hibernate.struts2.plugin.\
annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.\
annotations.TransactionTarget;
public class StudentDAO {
@SessionTarget
Session session;
@TransactionTarget
Transaction transaction;
@SuppressWarnings("unchecked")
public List<Student> getStudents() {
List<Student> students = new ArrayList<Student>();
try {
students = session.createQuery("from Student").list();
} catch(Exception e) {
e.printStackTrace();
}
return students;
}
public void addStudent(Student student) {
session.save(student);
}
}
Lớp StudentDAO là lớp truy cập dữ liệu cho lớp Sinh viên. Nó có các phương pháp để liệt kê tất cả học sinh và sau đó để lưu một hồ sơ học sinh mới.
Lớp hành động
Theo dõi tập tin AddStudentAction.javaxác định lớp hành động của chúng tôi. Chúng ta có hai phương thức hành động ở đây - execute () và listStudents (). Phương thức execute () được sử dụng để thêm bản ghi sinh viên mới. Chúng tôi sử dụng phương thức save () của dao để đạt được điều này.
Phương thức khác, listStudents () được sử dụng để liệt kê các sinh viên. Chúng tôi sử dụng phương pháp danh sách của dao để có được danh sách tất cả các học sinh.
package com.tutorialspoint.struts2;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.tutorialspoint.hibernate.Student;
import com.tutorialspoint.hibernate.StudentDAO;
public class AddStudentAction extends ActionSupport implements ModelDriven<Student> {
Student student = new Student();
List<Student> students = new ArrayList<Student>();
StudentDAO dao = new StudentDAO();
@Override
public Student getModel() {
return student;
}
public String execute() {
dao.addStudent(student);
return "success";
}
public String listStudents() {
students = dao.getStudents();
return "success";
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
Bạn sẽ nhận thấy rằng chúng tôi đang triển khai giao diện ModelDriven. Điều này được sử dụng khi lớp hành động của bạn đang xử lý một lớp mô hình cụ thể (chẳng hạn như Sinh viên) thay vì các thuộc tính riêng lẻ (chẳng hạn như firstName, lastName). Giao diện ModelAware yêu cầu bạn triển khai một phương thức để trả về mô hình. Trong trường hợp của chúng tôi, chúng tôi đang trả về đối tượng "student".
Tạo tệp xem
Bây giờ hãy để chúng tôi tạo student.jsp xem tệp với nội dung sau:
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action = "addStudent">
<s:textfield name = "firstName" label = "First Name"/>
<s:textfield name = "lastName" label = "Last Name"/>
<s:textfield name = "marks" label = "Marks"/>
<s:submit/>
<hr/>
<table>
<tr>
<td>First Name</td>
<td>Last Name</td>
<td>Marks</td>
</tr>
<s:iterator value = "students">
<tr>
<td><s:property value = "firstName"/></td>
<td><s:property value = "lastName"/></td>
<td><s:property value = "marks"/></td>
</tr>
</s:iterator>
</table>
</s:form>
</body>
</html>
Student.jsp khá đơn giản. Ở phần trên cùng, chúng tôi có một biểu mẫu gửi tới "addStudent.action". Nó có trong firstName, lastName và các dấu. Bởi vì hành động addStudent được liên kết với "AddSudentAction" của ModelAware, tự động một bean sinh viên sẽ được tạo với các giá trị cho firstName, lastName và đánh dấu được tự động điền.
Ở phần dưới cùng, chúng ta xem qua danh sách sinh viên (xem AddStudentAction.java). Chúng tôi lặp qua danh sách và hiển thị các giá trị cho tên, họ và dấu trong bảng.
Cấu hình Struts
Hãy để chúng tôi kết hợp tất cả lại với nhau bằng cách sử dụng struts.xml -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "myhibernate" extends = "hibernate-default">
<action name = "addStudent" method = "execute"
class = "com.tutorialspoint.struts2.AddStudentAction">
<result name = "success" type = "redirect">
listStudents
</result>
</action>
<action name = "listStudents" method = "listStudents"
class = "com.tutorialspoint.struts2.AddStudentAction">
<result name = "success">/students.jsp</result>
</action>
</package>
</struts>
Điều quan trọng cần lưu ý ở đây là gói "myhibernate" của chúng tôi mở rộng gói mặc định struts2 được gọi là "hibernate-default". Sau đó, chúng tôi khai báo hai hành động - addStudent và listStudents. addStudent gọi thực thi () trên lớp AddStudentAction và sau đó khi thành công, nó gọi phương thức hành động listStudents.
Phương thức hành động listStudent gọi listStudents () trên lớp AddStudentAction và sử dụng student.jsp làm dạng xem.
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/student.jsp. Điều này sẽ tạo ra màn hình sau:
Trong phần trên cùng, chúng tôi nhận được một biểu mẫu để nhập các giá trị cho hồ sơ học sinh mới và phần dưới cùng liệt kê các học sinh trong cơ sở dữ liệu. Hãy tiếp tục và thêm hồ sơ học sinh mới và nhấn gửi. Màn hình sẽ làm mới và hiển thị cho bạn danh sách cập nhật mỗi khi bạn nhấp vào Gửi.