JSP - Hướng dẫn nhanh

Trang JavaServer là gì?

JavaServer Pages (JSP) là công nghệ phát triển các Trang web hỗ trợ nội dung động. Điều này giúp các nhà phát triển chèn mã java vào các trang HTML bằng cách sử dụng các thẻ JSP đặc biệt, hầu hết trong số đó bắt đầu bằng <% và kết thúc bằng%>.

Thành phần JavaServer Pages là một loại Java servlet được thiết kế để thực hiện vai trò của giao diện người dùng cho một ứng dụng web Java. Các nhà phát triển web viết JSP dưới dạng tệp văn bản kết hợp mã HTML hoặc XHTML, các phần tử XML, các hành động và lệnh JSP được nhúng.

Sử dụng JSP, bạn có thể thu thập thông tin đầu vào từ người dùng thông qua biểu mẫu Trang web, trình bày bản ghi từ cơ sở dữ liệu hoặc nguồn khác và tạo Trang web động.

Thẻ JSP có thể được sử dụng cho nhiều mục đích khác nhau, chẳng hạn như truy xuất thông tin từ cơ sở dữ liệu hoặc đăng ký tùy chọn người dùng, truy cập các thành phần JavaBeans, chuyển quyền kiểm soát giữa các trang và chia sẻ thông tin giữa các yêu cầu, trang, v.v.

Tại sao sử dụng JSP?

Các trang JavaServer thường phục vụ cùng một mục đích như các chương trình được triển khai bằng cách sử dụng Common Gateway Interface (CGI). Nhưng JSP cung cấp một số lợi thế so với CGI.

  • Hiệu suất tốt hơn đáng kể vì JSP cho phép nhúng Phần tử động vào chính các Trang HTML thay vì có các tệp CGI riêng biệt.

  • JSP luôn được biên dịch trước khi chúng được máy chủ xử lý không giống như CGI / Perl yêu cầu máy chủ tải trình thông dịch và tập lệnh đích mỗi khi trang được yêu cầu.

  • Các trang JavaServer được xây dựng trên Java Servlets API, vì vậy, giống như Servlets, JSP cũng có quyền truy cập vào tất cả các API Enterprise Java mạnh mẽ, bao gồm JDBC, JNDI, EJB, JAXP, Vân vân.

  • Các trang JSP có thể được sử dụng kết hợp với các servlet xử lý logic nghiệp vụ, mô hình được hỗ trợ bởi các công cụ mẫu servlet Java.

Cuối cùng, JSP là một phần không thể thiếu của Java EE, một nền tảng hoàn chỉnh cho các ứng dụng cấp doanh nghiệp. Điều này có nghĩa là JSP có thể đóng một vai trò trong các ứng dụng đơn giản nhất đến phức tạp và khắt khe nhất.

Ưu điểm của JSP

Bảng sau liệt kê những lợi thế khác của việc sử dụng JSP so với các công nghệ khác:

so với Trang máy chủ đang hoạt động (ASP)

Lợi thế của JSP là gấp đôi. Đầu tiên, phần động được viết bằng Java, không phải Visual Basic hoặc ngôn ngữ cụ thể khác của MS, vì vậy nó mạnh hơn và dễ sử dụng hơn. Thứ hai, nó có thể di động đến các hệ điều hành khác và các máy chủ Web không phải của Microsoft.

so với Servlet thuần túy

Sẽ thuận tiện hơn khi viết (và sửa đổi!) HTML thông thường hơn là có nhiều câu lệnh println tạo HTML.

so với Bao gồm phía máy chủ (SSI)

SSI thực sự chỉ dành cho các bao hàm đơn giản, không dành cho các chương trình "thực" sử dụng dữ liệu biểu mẫu, tạo kết nối cơ sở dữ liệu, và những thứ tương tự.

so với JavaScript

JavaScript có thể tạo HTML động trên máy khách nhưng khó có thể tương tác với máy chủ web để thực hiện các tác vụ phức tạp như truy cập cơ sở dữ liệu và xử lý hình ảnh, v.v.

so với HTML tĩnh

Tất nhiên, HTML thông thường không thể chứa thông tin động.

Tiếp theo là gì?

Tôi sẽ hướng dẫn bạn từng bước thiết lập môi trường của bạn để bắt đầu với JSP. Tôi cho rằng bạn có kiến ​​thức tốt về Lập trình Java để tiếp tục học JSP.

Nếu bạn chưa biết về Ngôn ngữ lập trình Java, thì chúng tôi khuyên bạn nên xem qua Hướng dẫn Java của chúng tôi để hiểu về Lập trình Java.

Môi trường phát triển là nơi bạn sẽ phát triển các chương trình JSP của mình, kiểm tra chúng và cuối cùng là chạy chúng.

Hướng dẫn này sẽ hướng dẫn bạn thiết lập môi trường phát triển JSP bao gồm các bước sau:

Thiết lập Bộ phát triển Java

Bước này liên quan đến việc tải xuống bản triển khai Bộ phát triển phần mềm Java (SDK) và thiết lập biến môi trường PATH một cách thích hợp.

Bạn có thể tải xuống SDK từ trang Java của Oracle - Java SE Downloads .

Sau khi bạn tải xuống triển khai Java của mình, hãy làm theo các hướng dẫn đã cho để cài đặt và định cấu hình thiết lập. Cuối cùng thiết lậpPATH and JAVA_HOME biến môi trường để tham chiếu đến thư mục chứa javajavac, thông thường java_install_dir/binjava_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 cần thêm dòng sau vào C:\autoexec.bat tập tin.

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ũng có thể nhấp chuột phải vào My Computer, lựa chọn Properties, sau đó Advanced, theo dõi bởi Environment Variables. 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 những thứ sau vào .cshrc tập tin.

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 Integrated Development Environment (IDE) giống Borland JBuilder, Eclipse, IntelliJ IDEA, hoặc là Sun ONE Studio, 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.

Thiết lập Máy chủ Web: Tomcat

Một số Máy chủ Web hỗ trợ phát triển Trang và Máy chủ JavaServer có sẵn trên thị trường. Một số máy chủ web có thể được tải xuống miễn phí và Tomcat là một trong số đó.

Apache Tomcat là một phần mềm mã nguồn mở triển khai các công nghệ JavaServer Pages và Servlet và có thể hoạt động như một máy chủ độc lập để kiểm tra JSP và Servlet, đồng thời có thể được tích hợp với Apache Web Server. Dưới đây là các bước để thiết lập Tomcat trên máy của bạn -

  • 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ụ, trongC:\apache-tomcat-5.5.29 on windows, or /usr/local/apache-tomcat-5.5.29 trên Linux / Unix và tạo CATALINA_HOME biến môi trường trỏ đến các vị trí này.

Tomcat có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Windows:

%CATALINA_HOME%\bin\startup.bat
 
or
 
C:\apache-tomcat-5.5.29\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-5.5.29/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/.

Khi thực hiện, bạn sẽ nhận được 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 có ở đâ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 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

Thiết lập CLASSPATH

Vì các servlet không phải là một phần của Nền tảng Java, Phiên bản Tiêu chuẩn, bạn phải xác định các lớp servlet cho trình biên dịch.

Nếu bạn đang chạy Windows, bạn cần đặt các dòng sau vào C:\autoexec.bat tập tin.

set CATALINA = C:\apache-tomcat-5.5.29
set CLASSPATH = %CATALINA%\common\lib\jsp-api.jar;%CLASSPATH%

Ngoài ra, trên Windows NT/2000/XP, bạn cũng có thể nhấp chuột phải vào My Computer, lựa chọn Properties, sau đó Advanced, sau đó Environment Variables. Sau đó, bạn sẽ cập nhật giá trị CLASSPATH và nhấn nút OK.

Trên Unix (Solaris, Linux, v.v.), nếu bạn đang sử dụng C shell, bạn sẽ đặt các dòng sau vào .cshrc tập tin.

setenv CATALINA = /usr/local/apache-tomcat-5.5.29
setenv CLASSPATH $CATALINA/common/lib/jsp-api.jar:$CLASSPATH

NOTE - Giả sử rằng thư mục phát triển của bạn là C:\JSPDev (Windows) hoặc là /usr/JSPDev (Unix), thì bạn cũng cần thêm các thư mục này vào CLASSPATH.

Máy chủ web cần một công cụ JSP, tức là một bộ chứa để xử lý các trang JSP. Vùng chứa JSP chịu trách nhiệm chặn các yêu cầu đối với các trang JSP. Hướng dẫn này sử dụng Apache có bộ chứa JSP tích hợp để hỗ trợ phát triển các trang JSP.

Vùng chứa JSP hoạt động với máy chủ Web để cung cấp môi trường thời gian chạy và các dịch vụ khác mà JSP cần. Nó biết cách hiểu các phần tử đặc biệt là một phần của JSP.

Sơ đồ sau đây cho thấy vị trí của JSP container và các tệp JSP trong một ứng dụng Web.

Xử lý JSP

Các bước sau giải thích cách máy chủ web tạo Trang web bằng JSP:

  • Như với một trang bình thường, trình duyệt của bạn sẽ gửi một yêu cầu HTTP đến máy chủ web.

  • Máy chủ web nhận ra rằng yêu cầu HTTP dành cho một trang JSP và chuyển tiếp nó tới một công cụ JSP. Điều này được thực hiện bằng cách sử dụng URL hoặc trang JSP kết thúc bằng.jsp thay vì .html.

  • Công cụ JSP tải trang JSP từ đĩa và chuyển đổi nó thành một nội dung servlet. Việc chuyển đổi này rất đơn giản, trong đó tất cả văn bản mẫu được chuyển đổi thành các câu lệnh println () và tất cả các phần tử JSP được chuyển đổi thành mã Java. Mã này thực hiện hành vi động tương ứng của trang.

  • Công cụ JSP biên dịch servlet thành một lớp thực thi và chuyển tiếp yêu cầu ban đầu đến một động cơ servlet.

  • Một phần của máy chủ web được gọi là công cụ servlet tải lớp Servlet và thực thi nó. Trong quá trình thực thi, servlet tạo ra một đầu ra ở định dạng HTML. Đầu ra được chuyển tới máy chủ web bởi công cụ servlet bên trong một phản hồi HTTP.

  • Máy chủ web chuyển tiếp phản hồi HTTP tới trình duyệt của bạn dưới dạng nội dung HTML tĩnh.

  • Cuối cùng, trình duyệt web xử lý trang HTML được tạo động bên trong phản hồi HTTP chính xác như thể nó là một trang tĩnh.

Tất cả các bước được đề cập ở trên có thể được nhìn thấy trong sơ đồ sau:

Thông thường, JSP engine sẽ kiểm tra xem liệu một servlet cho tệp JSP đã tồn tại hay chưa và liệu ngày sửa đổi trên JSP có cũ hơn servlet hay không. Nếu JSP cũ hơn servlet được tạo của nó, JSP container sẽ giả định rằng JSP không thay đổi và servlet được tạo vẫn khớp với nội dung của JSP. Điều này làm cho quá trình hiệu quả hơn so với các ngôn ngữ kịch bản khác (chẳng hạn như PHP) và do đó nhanh hơn.

Vì vậy, theo một cách nào đó, trang JSP thực sự chỉ là một cách khác để viết một servlet mà không cần phải là một wiz lập trình Java. Ngoại trừ giai đoạn dịch, một trang JSP được xử lý giống hệt như một servlet thông thường.

Trong chương này, chúng ta sẽ thảo luận về vòng đời của JSP. Chìa khóa để hiểu chức năng cấp thấp của JSP là hiểu vòng đời đơn giản mà chúng tuân theo.

Vòng đời của JSP được định nghĩa là quá trình từ khi tạo ra nó cho đến khi bị phá hủy. Điều này tương tự như một vòng đời của servlet với một bước bổ sung được yêu cầu để biên dịch JSP thành servlet.

Các con đường được theo dõi bởi JSP

Sau đây là các đường dẫn được theo sau bởi một JSP:

  • Compilation
  • Initialization
  • Execution
  • Cleanup

Bốn giai đoạn chính của vòng đời JSP rất giống với Vòng đời của Servlet. Bốn giai đoạn đã được mô tả dưới đây:

Tổng hợp JSP

Khi trình duyệt yêu cầu JSP, đầu tiên JSP engine sẽ kiểm tra xem nó có cần biên dịch trang hay không. Nếu trang chưa bao giờ được biên dịch hoặc nếu JSP đã được sửa đổi kể từ lần biên dịch cuối cùng, thì công cụ JSP sẽ biên dịch trang.

Quá trình biên dịch bao gồm ba bước:

  • Phân tích cú pháp JSP.
  • Biến JSP thành một servlet.
  • Biên dịch servlet.

Khởi tạo JSP

Khi một vùng chứa tải một JSP, nó sẽ gọi jspInit()trước khi phục vụ bất kỳ yêu cầu nào. Nếu bạn cần thực hiện khởi tạo JSP cụ thể, hãy ghi đèjspInit() phương pháp -

public void jspInit(){
   // Initialization code...
}

Thông thường, việc khởi tạo chỉ được thực hiện một lần và như với phương thức init của servlet, bạn thường khởi tạo các kết nối cơ sở dữ liệu, mở tệp và tạo bảng tra cứu trong phương thức jspInit.

Thực thi JSP

Giai đoạn này của vòng đời JSP đại diện cho tất cả các tương tác với các yêu cầu cho đến khi JSP bị hủy.

Bất cứ khi nào trình duyệt yêu cầu JSP và trang đã được tải và khởi tạo, công cụ JSP sẽ gọi _jspService() trong JSP.

Phương thức _jspService () nhận một HttpServletRequest và một HttpServletResponse như các thông số của nó như sau:

void _jspService(HttpServletRequest request, HttpServletResponse response) {
   // Service handling code...
}

Các _jspService()phương thức của một JSP được gọi trên cơ sở yêu cầu. Phương thức này chịu trách nhiệm tạo phản hồi cho yêu cầu đó và phương thức này cũng chịu trách nhiệm tạo phản hồi cho tất cả bảy phương thức HTTP, tức làGET, POST, DELETE, Vân vân.

Dọn dẹp JSP

Giai đoạn phá hủy của vòng đời JSP biểu thị khi một JSP được vùng chứa loại bỏ khỏi việc sử dụng.

Các jspDestroy()phương thức là JSP tương đương với phương thức hủy cho các servlet. Ghi đè jspDestroy khi bạn cần thực hiện bất kỳ hoạt động dọn dẹp nào, chẳng hạn như giải phóng các kết nối cơ sở dữ liệu hoặc đóng các tệp đang mở.

Phương thức jspDestroy () có dạng sau:

public void jspDestroy() {
   // Your cleanup code goes here.
}

Trong chương này, chúng ta sẽ thảo luận về Cú pháp trong JSP. Chúng ta sẽ hiểu cách sử dụng cơ bản của cú pháp đơn giản (tức là các phần tử) liên quan đến phát triển JSP.

Các yếu tố của JSP

Các phần tử của JSP đã được mô tả dưới đây:

Scriptlet

Một scriptlet có thể chứa bất kỳ số lượng câu lệnh ngôn ngữ JAVA, khai báo biến hoặc phương thức hoặc biểu thức hợp lệ trong ngôn ngữ kịch bản trang.

Sau đây là cú pháp của Scriptlet:

<% code fragment %>

Bạn có thể viết XML tương đương với cú pháp trên như sau:

<jsp:scriptlet>
   code fragment
</jsp:scriptlet>

Bất kỳ văn bản, thẻ HTML hoặc phần tử JSP nào bạn viết phải nằm ngoài scriptlet. Sau đây là ví dụ đơn giản và đầu tiên cho JSP:

<html>
   <head><title>Hello World</title></head>
   
   <body>
      Hello World!<br/>
      <%
         out.println("Your IP address is " + request.getRemoteAddr());
      %>
   </body>
</html>

NOTE - Giả sử rằng Apache Tomcat được cài đặt trong C: \ apache-tomcat-7.0.2 và môi trường của bạn được thiết lập theo hướng dẫn thiết lập môi trường.

Hãy để chúng tôi giữ mã trên trong tệp JSP hello.jsp và đưa tệp này vào C:\apache-tomcat7.0.2\webapps\ROOTdanh mục. Duyệt qua cùng một URL bằng cách sử dụnghttp://localhost:8080/hello.jsp. Đoạn mã trên sẽ tạo ra kết quả sau:

Khai báo JSP

Một khai báo khai báo một hoặc nhiều biến hoặc phương thức mà bạn có thể sử dụng trong mã Java sau này trong tệp JSP. Bạn phải khai báo biến hoặc phương thức trước khi sử dụng nó trong tệp JSP.

Sau đây là cú pháp cho Khai báo JSP:

<%! declaration; [ declaration; ]+ ... %>

Bạn có thể viết XML tương đương với cú pháp trên như sau:

<jsp:declaration>
   code fragment
</jsp:declaration>

Sau đây là một ví dụ cho Khai báo JSP:

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %>

Biểu thức JSP

Phần tử biểu thức JSP chứa biểu thức ngôn ngữ kịch bản được đánh giá, chuyển đổi thành Chuỗi và được chèn vào nơi biểu thức xuất hiện trong tệp JSP.

Vì giá trị của một biểu thức được chuyển đổi thành Chuỗi, bạn có thể sử dụng một biểu thức trong một dòng văn bản, cho dù nó có được gắn thẻ HTML hay không, trong tệp JSP.

Phần tử biểu thức có thể chứa bất kỳ biểu thức nào hợp lệ theo Đặc tả ngôn ngữ Java nhưng bạn không thể sử dụng dấu chấm phẩy để kết thúc biểu thức.

Sau đây là cú pháp của JSP Expression:

<%= expression %>

Bạn có thể viết XML tương đương với cú pháp trên như sau:

<jsp:expression>
   expression
</jsp:expression>

Ví dụ sau cho thấy một biểu thức JSP -

<html> 
   <head><title>A Comment Test</title></head> 
   
   <body>
      <p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
   </body> 
</html>

Đoạn mã trên sẽ tạo ra kết quả sau:

Today's date: 11-Sep-2010 21:24:25

Nhận xét JSP

Nhận xét JSP đánh dấu văn bản hoặc câu lệnh mà vùng chứa JSP nên bỏ qua. Nhận xét JSP hữu ích khi bạn muốn ẩn hoặc "bỏ nhận xét", một phần của trang JSP của bạn.

Sau đây là cú pháp của các bình luận JSP:

<%-- This is JSP comment --%>

Ví dụ sau đây cho thấy các Nhận xét JSP -

<html> 
   <head><title>A Comment Test</title></head> 
   
   <body> 
      <h2>A Test of Comments</h2> 
      <%-- This comment will not be visible in the page source --%> 
   </body> 
</html>

Đoạn mã trên sẽ tạo ra kết quả sau:

A Test of Comments

Có một số ít cấu trúc đặc biệt mà bạn có thể sử dụng trong các trường hợp khác nhau để chèn nhận xét hoặc ký tự mà nếu không sẽ được xử lý đặc biệt. Đây là một bản tóm tắt -

Không. Cú pháp & Mục đích
1

<%-- comment --%>

Một bình luận của JSP. Bị bỏ qua bởi động cơ JSP.

2

<!-- comment -->

Một nhận xét HTML. Bị trình duyệt bỏ qua.

3

<\%

Đại diện cho ký tự tĩnh <%.

4

%\>

Đại diện cho static%> theo nghĩa đen.

5

\'

Một dấu ngoặc kép trong một thuộc tính sử dụng dấu ngoặc kép.

6

\"

Dấu ngoặc kép trong một thuộc tính sử dụng dấu ngoặc kép.

Chỉ thị JSP

Một chỉ thị JSP ảnh hưởng đến cấu trúc tổng thể của lớp servlet. Nó thường có dạng sau:

<%@ directive attribute="value" %>

Có ba loại thẻ chỉ thị -

Không. Chỉ thị & Mô tả
1

<%@ page ... %>

Xác định các thuộc tính phụ thuộc vào trang, chẳng hạn như ngôn ngữ tập lệnh, trang lỗi và các yêu cầu về bộ đệm.

2

<%@ include ... %>

Bao gồm một tệp trong giai đoạn dịch.

3

<%@ taglib ... %>

Khai báo thư viện thẻ, chứa các hành động tùy chỉnh, được sử dụng trong trang

Chúng tôi sẽ giải thích chỉ thị JSP trong một chương riêng biệt JSP - Chỉ thị

Hành động JSP

Các hành động JSP sử dụng constructstrong cú pháp XML để kiểm soát hành vi của động cơ servlet. Bạn có thể tự động chèn tệp, sử dụng lại các thành phần JavaBeans, chuyển tiếp người dùng đến một trang khác hoặc tạo HTML cho plugin Java.

Chỉ có một cú pháp cho phần tử Hành động, vì nó tuân theo tiêu chuẩn XML -

<jsp:action_name attribute="value" />

Yếu tố hành động về cơ bản là các chức năng được xác định trước. Bảng sau liệt kê các Hành động JSP có sẵn:

Không. Cú pháp & Mục đích
1

jsp:include

Bao gồm một tệp tại thời điểm trang được yêu cầu.

2

jsp:useBean

Tìm hoặc khởi tạo một JavaBean.

3

jsp:setProperty

Đặt thuộc tính của JavaBean.

4

jsp:getProperty

Chèn thuộc tính của JavaBean vào đầu ra.

5

jsp:forward

Chuyển tiếp người yêu cầu đến một trang mới.

6

jsp:plugin

Tạo mã dành riêng cho trình duyệt tạo thẻ OBJECT hoặc EMBED cho plugin Java.

7

jsp:element

Định nghĩa động các phần tử XML.

số 8

jsp:attribute

Xác định thuộc tính của phần tử XML được xác định động.

9

jsp:body

Xác định nội dung của phần tử XML được xác định động.

10

jsp:text

Được sử dụng để viết văn bản mẫu trong các trang và tài liệu JSP.

Chúng tôi sẽ giải thích các hành động JSP trong một chương riêng JSP - Các hành động

Các đối tượng ngầm định của JSP

JSP hỗ trợ chín biến được xác định tự động, còn được gọi là các đối tượng ngầm định. Các biến này là -

Không. Mô tả đối tượng
1

request

Đây là HttpServletRequest đối tượng liên kết với yêu cầu.

2

response

Đây là HttpServletResponse đối tượng kết hợp với phản hồi cho khách hàng.

3

out

Đây là PrintWriter đối tượng được sử dụng để gửi đầu ra cho máy khách.

4

session

Đây là HttpSession đối tượng liên kết với yêu cầu.

5

application

Đây là ServletContext đối tượng liên kết với ngữ cảnh ứng dụng.

6

config

Đây là ServletConfig đối tượng liên kết với trang.

7

pageContext

Điều này bao gồm việc sử dụng các tính năng dành riêng cho máy chủ như hiệu suất cao hơn JspWriters.

số 8

page

Đây chỉ đơn giản là một từ đồng nghĩa với this, và được sử dụng để gọi các phương thức được định nghĩa bởi lớp servlet đã dịch.

9

Exception

Các Exception đối tượng cho phép dữ liệu ngoại lệ được truy cập bởi JSP được chỉ định.

Chúng tôi sẽ giải thích các đối tượng ngầm định của JSP trong một chương riêng JSP - Đối tượng ngầm định .

Tuyên bố luồng kiểm soát

Bạn có thể sử dụng tất cả các API và khối xây dựng của Java trong lập trình JSP của mình bao gồm các câu lệnh ra quyết định, các vòng lặp, v.v.

Tuyên bố ra quyết định

Các if...else khối bắt đầu giống như một Scriptlet thông thường, nhưng Scriptlet được đóng ở mỗi dòng với văn bản HTML được bao gồm giữa các thẻ Scriptlet.

<%! int day = 3; %> 
<html> 
   <head><title>IF...ELSE Example</title></head> 
   
   <body>
      <% if (day == 1 || day == 7) { %>
         <p> Today is weekend</p>
      <% } else { %>
         <p> Today is not weekend</p>
      <% } %>
   </body> 
</html>

Đoạn mã trên sẽ tạo ra kết quả sau:

Today is not weekend

Bây giờ hãy xem những điều sau switch...case khối đã được viết khác một chút bằng cách sử dụng out.println() và bên trong Scriptletas -

<%! int day = 3; %> 
<html> 
   <head><title>SWITCH...CASE Example</title></head> 
   
   <body>
      <% 
         switch(day) {
            case 0:
               out.println("It\'s Sunday.");
               break;
            case 1:
               out.println("It\'s Monday.");
               break;
            case 2:
               out.println("It\'s Tuesday.");
               break;
            case 3:
               out.println("It\'s Wednesday.");
               break;
            case 4:
               out.println("It\'s Thursday.");
               break;
            case 5:
               out.println("It\'s Friday.");
               break;
            default:
               out.println("It's Saturday.");
         }
      %>
   </body> 
</html>

Đoạn mã trên sẽ tạo ra kết quả sau:

It's Wednesday.

Tuyên bố vòng lặp

Bạn cũng có thể sử dụng ba loại khối lặp cơ bản trong Java: for, while, and do…while trong lập trình JSP của bạn.

Chúng ta hãy xem xét những điều sau for ví dụ về vòng lặp -

<%! int fontSize; %> 
<html> 
   <head><title>FOR LOOP Example</title></head> 
   
   <body>
      <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
         <font color = "green" size = "<%= fontSize %>">
            JSP Tutorial
      </font><br />
      <%}%>
   </body> 
</html>

Đoạn mã trên sẽ tạo ra kết quả sau:

JSP Tutorial 
JSP Tutorial
JSP Tutorial

Ví dụ trên có thể được viết bằng cách sử dụng while vòng lặp như sau -

<%! int fontSize; %> 
<html> 
   <head><title>WHILE LOOP Example</title></head> 
   
   <body>
      <%while ( fontSize <= 3){ %>
         <font color = "green" size = "<%= fontSize %>">
            JSP Tutorial
         </font><br />
         <%fontSize++;%>
      <%}%>
   </body> 
</html>

Đoạn mã trên sẽ tạo ra kết quả sau:

JSP Tutorial 

 JSP Tutorial 

 JSP Tutorial

Nhà điều hành JSP

JSP hỗ trợ tất cả các toán tử logic và số học được Java hỗ trợ. Bảng sau liệt kê tất cả các toán tử có mức độ ưu tiên cao nhất xuất hiện ở đầu bảng, những toán tử có mức độ ưu tiên thấp nhất xuất hiện ở cuối bảng.

Trong một biểu thức, các toán tử có mức độ ưu tiên cao hơn sẽ được đánh giá đầu tiên.

thể loại Nhà điều hành Sự liên kết
Postfix () []. (toán tử dấu chấm) Trái sang phải
Một ngôi ++ - -! ~ Phải sang trái
Phép nhân * /% Trái sang phải
Phụ gia + - Trái sang phải
Shift >> >>> << Trái sang phải
Quan hệ >> = <<= Trái sang phải
Bình đẳng ==! = Trái sang phải
Bitwise VÀ & Trái sang phải
Bitwise XOR ^ Trái sang phải
Bitwise HOẶC | Trái sang phải
Logic AND && Trái sang phải
Logic HOẶC || Trái sang phải
Có điều kiện ?: Phải sang trái
Chuyển nhượng = + = - = * = / =% = >> = << = & = ^ = | = Phải sang trái
Dấu phẩy , Trái sang phải

JSP Literals

Ngôn ngữ biểu thức JSP xác định các ký tự sau:

  • Boolean - đúng và sai

  • Integer - như trong Java

  • Floating point - như trong Java

  • String- với dấu ngoặc kép và đơn; "được thoát dưới dạng \", 'được thoát dưới dạng \' và \ được thoát dưới dạng \\.

  • Null - null

Trong chương này, chúng ta sẽ thảo luận về các Chỉ thị trong JSP. Các chỉ thị này cung cấp các chỉ dẫn và hướng dẫn cho vùng chứa, cho nó biết cách xử lý các khía cạnh nhất định của quá trình xử lý JSP.

Một chỉ thị JSP ảnh hưởng đến cấu trúc tổng thể của lớp servlet. Nó thường có dạng sau:

<%@ directive attribute = "value" %>

Các chỉ thị có thể có một số thuộc tính mà bạn có thể liệt kê dưới dạng các cặp khóa-giá trị và được phân tách bằng dấu phẩy.

Khoảng trống giữa ký hiệu @ và tên chỉ thị và giữa thuộc tính cuối cùng và% đóng> là tùy chọn.

Có ba loại thẻ chỉ thị -

Không. Chỉ thị & Mô tả
1

<%@ page ... %>

Xác định các thuộc tính phụ thuộc vào trang, chẳng hạn như ngôn ngữ tập lệnh, trang lỗi và các yêu cầu về bộ đệm.

2

<%@ include ... %>

Bao gồm một tệp trong giai đoạn dịch.

3

<%@ taglib ... %>

Khai báo thư viện thẻ, chứa các hành động tùy chỉnh, được sử dụng trong trang

JSP - Chỉ thị trang

Các pageChỉ thị được sử dụng để cung cấp hướng dẫn cho vùng chứa. Các hướng dẫn này liên quan đến trang JSP hiện tại. Bạn có thể viết mã lệnh trang ở bất kỳ đâu trong trang JSP của mình. Theo quy ước, chỉ thị trang được mã hóa ở đầu trang JSP.

Sau đây là cú pháp cơ bản của chỉ thị trang:

<%@ page attribute = "value" %>

Bạn có thể viết XML tương đương với cú pháp trên như sau:

<jsp:directive.page attribute = "value" />

Thuộc tính

Bảng sau liệt kê các thuộc tính được liên kết với chỉ thị trang -

Không. Thuộc tính & Mục đích
1

buffer

Chỉ định mô hình đệm cho luồng đầu ra.

2

autoFlush

Kiểm soát hành vi của bộ đệm đầu ra servlet.

3

contentType

Xác định lược đồ mã hóa ký tự.

4

errorPage

Xác định URL của một JSP khác báo cáo về các ngoại lệ thời gian chạy không được kiểm tra của Java.

5

isErrorPage

Cho biết liệu trang JSP này có phải là URL được chỉ định bởi thuộc tính errorPage của trang JSP khác hay không.

6

extends

Chỉ định một lớp cha mà servlet đã tạo phải mở rộng.

7

import

Chỉ định danh sách các gói hoặc lớp để sử dụng trong JSP giống như câu lệnh nhập Java đối với các lớp Java.

số 8

info

Xác định một chuỗi có thể được truy cập bằng servlet của getServletInfo() phương pháp.

9

isThreadSafe

Xác định mô hình phân luồng cho servlet đã tạo.

10

language

Xác định ngôn ngữ lập trình được sử dụng trong trang JSP.

11

session

Chỉ định xem trang JSP có tham gia vào các phiên HTTP hay không

12

isELIgnored

Chỉ định xem biểu thức EL trong trang JSP có bị bỏ qua hay không.

13

isScriptingEnabled

Xác định xem các phần tử kịch bản có được phép sử dụng hay không.

Kiểm tra để biết thêm chi tiết liên quan đến tất cả các thuộc tính trên tại Chỉ thị trang .

Chỉ thị bao gồm

Các includeChỉ thị được sử dụng để bao gồm một tệp trong giai đoạn dịch. Lệnh này yêu cầu vùng chứa hợp nhất nội dung của các tệp bên ngoài khác với JSP hiện tại trong giai đoạn dịch. Bạn có thể viết mãinclude chỉ thị ở bất kỳ đâu trong trang JSP của bạn.

Hình thức sử dụng chung của chỉ thị này như sau:

<%@ include file = "relative url" >

Tên tệp trong chỉ thị include thực sự là một URL tương đối. Nếu bạn chỉ chỉ định một tên tệp không có đường dẫn liên kết, trình biên dịch JSP sẽ giả định rằng tệp nằm trong cùng thư mục với JSP của bạn.

Bạn có thể viết XML tương đương với cú pháp trên như sau:

<jsp:directive.include file = "relative url" />

Để biết thêm chi tiết liên quan đến chỉ thị bao gồm, hãy kiểm tra Chỉ thị bao gồm .

Chỉ thị về taglib

API Trang JavaServer cho phép bạn xác định các thẻ JSP tùy chỉnh trông giống như các thẻ HTML hoặc XML và thư viện thẻ là một tập hợp các thẻ do người dùng xác định để triển khai hành vi tùy chỉnh.

Các taglib Chỉ thị tuyên bố rằng trang JSP của bạn sử dụng một tập hợp các thẻ tùy chỉnh, xác định vị trí của thư viện và cung cấp các phương tiện để xác định các thẻ tùy chỉnh trong trang JSP của bạn.

Lệnh taglib tuân theo cú pháp được cung cấp bên dưới:

<%@ taglib uri="uri" prefix = "prefixOfTag" >

Đây, uri giá trị thuộc tính phân giải thành một vị trí mà vùng chứa hiểu và prefix thuộc tính thông báo cho vùng chứa những bit đánh dấu nào là hành động tùy chỉnh.

Bạn có thể viết XML tương đương với cú pháp trên như sau:

<jsp:directive.taglib uri = "uri" prefix = "prefixOfTag" />

Để biết thêm chi tiết liên quan đến chỉ thị taglib, hãy xem Chỉ thị Taglib .

Trong chương này, chúng ta sẽ thảo luận về các Hành động trong JSP. Các hành động này sử dụng các cấu trúc trong cú pháp XML để kiểm soát hành vi của động cơ servlet. Bạn có thể tự động chèn tệp, sử dụng lại các thành phần JavaBeans, chuyển tiếp người dùng đến một trang khác hoặc tạo HTML cho plugin Java.

Chỉ có một cú pháp cho phần tử Hành động, vì nó tuân theo tiêu chuẩn XML -

<jsp:action_name attribute = "value" />

Yếu tố hành động về cơ bản là các chức năng được xác định trước. Bảng sau liệt kê các hành động JSP có sẵn:

Không. Cú pháp & Mục đích
1

jsp:include

Bao gồm một tệp tại thời điểm trang được yêu cầu.

2

jsp:useBean

Tìm hoặc khởi tạo một JavaBean.

3

jsp:setProperty

Đặt thuộc tính của JavaBean.

4

jsp:getProperty

Chèn thuộc tính của JavaBean vào đầu ra.

5

jsp:forward

Chuyển tiếp người yêu cầu đến một trang mới.

6

jsp:plugin

Tạo mã dành riêng cho trình duyệt tạo thẻ OBJECT hoặc EMBED cho plugin Java.

7

jsp:element

Định nghĩa động các phần tử XML.

số 8

jsp:attribute

Xác định thuộc tính của phần tử XML được xác định động.

9

jsp:body

Xác định nội dung của phần tử XML được xác định động.

10

jsp:text

Được sử dụng để viết văn bản mẫu trong các trang và tài liệu JSP.

Thuộc tính chung

Có hai thuộc tính chung cho tất cả các phần tử Hành động: id thuộc tính và scope thuộc tính.

Thuộc tính Id

Thuộc tính id xác định duy nhất phần tử Hành động và cho phép hành động được tham chiếu bên trong trang JSP. Nếu Hành động tạo ra một thể hiện của một đối tượng, giá trị id có thể được sử dụng để tham chiếu nó thông qua đối tượng ngầm định TrangContext.

Thuộc tính phạm vi

Thuộc tính này xác định vòng đời của phần tử Hành động. Thuộc tính id và thuộc tính phạm vi có liên quan trực tiếp, vì thuộc tính phạm vi xác định tuổi thọ của đối tượng được liên kết với id. Thuộc tính phạm vi có bốn giá trị có thể có:(a) page, (b)request, (c)session(d) application.

Hành động <jsp: include>

Hành động này cho phép bạn chèn tệp vào trang đang được tạo. Cú pháp trông như thế này -

<jsp:include page = "relative URL" flush = "true" />

Không giống như include Chỉ thị chèn tệp tại thời điểm trang JSP được dịch thành một servlet, hành động này sẽ chèn tệp vào thời điểm trang được yêu cầu.

Bảng sau liệt kê các thuộc tính được liên kết với hành động bao gồm:

Không. Thuộc tính & Mô tả
1

page

URL tương đối của trang được đưa vào.

2

flush

Thuộc tính boolean xác định xem tài nguyên được bao gồm có bị xóa bộ đệm trước khi nó được đưa vào hay không.

Thí dụ

Hãy để chúng tôi xác định hai tệp sau (a)date.jsp(b) main.jsp như sau -

Sau đây là nội dung của date.jsp tập tin -

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

Sau đây là nội dung của main.jsp tập tin -

<html>
   <head>
      <title>The include Action Example</title>
   </head>
   
   <body>
      <center>
         <h2>The include action Example</h2>
         <jsp:include page = "date.jsp" flush = "true" />
      </center>
   </body>
</html>

Bây giờ chúng ta hãy giữ tất cả các tệp này trong thư mục gốc và cố gắng truy cập main.jsp. Bạn sẽ nhận được kết quả sau:

The include action Example

Today's date: 12-Sep-2010 14:54:22

Hành động <jsp: useBean>

Các useBeanhành động khá linh hoạt. Đầu tiên, nó tìm kiếm một đối tượng hiện có bằng cách sử dụng các biến id và phạm vi. Nếu một đối tượng không được tìm thấy, nó sẽ cố gắng tạo đối tượng được chỉ định.

Cách đơn giản nhất để tải một bean như sau:

<jsp:useBean id = "name" class = "package.class" />

Sau khi một lớp bean được tải, bạn có thể sử dụng jsp:setPropertyjsp:getProperty các hành động để sửa đổi và truy xuất các thuộc tính bean.

Bảng sau liệt kê các thuộc tính được liên kết với hành động useBean:

Không. Thuộc tính & Mô tả
1

class

Chỉ định tên gói đầy đủ của đậu.

2

type

Chỉ định kiểu của biến sẽ tham chiếu đến đối tượng.

3

beanName

Cung cấp tên của bean như được chỉ định bởi phương thức Instantiate () của lớp java.beans.Beans.

Bây giờ chúng ta hãy thảo luận về jsp:setPropertyjsp:getProperty trước khi đưa ra một ví dụ hợp lệ liên quan đến các hành động này.

Hành động <jsp: setProperty>

Các setPropertyhành động đặt các thuộc tính của Bean. Bean phải được xác định trước đó trước hành động này. Có hai cách cơ bản để sử dụng hành động setProperty -

Bạn có thể dùng jsp:setProperty sau, nhưng bên ngoài một jsp:useBean phần tử, như được đưa ra bên dưới -

<jsp:useBean id = "myName" ... />
...
<jsp:setProperty name = "myName" property = "someProperty" .../>

Trong trường hợp này, jsp:setProperty được thực thi bất kể một bean mới đã được khởi tạo hay một bean hiện có đã được tìm thấy.

Bối cảnh thứ hai trong đó jsp: setProperty có thể xuất hiện bên trong phần thân của jsp:useBean phần tử, như được đưa ra bên dưới -

<jsp:useBean id = "myName" ... >
   ...
   <jsp:setProperty name = "myName" property = "someProperty" .../>
</jsp:useBean>

Ở đây, jsp: setProperty chỉ được thực thi khi một đối tượng mới được khởi tạo, chứ không phải nếu một đối tượng hiện có được tìm thấy.

Bảng sau liệt kê các thuộc tính được liên kết với setProperty hành động -

Không. Thuộc tính & Mô tả
1

name

Chỉ định bean thuộc tính sẽ được thiết lập. Bean phải được xác định trước đó.

2

property

Cho biết thuộc tính bạn muốn đặt. Giá trị "*" có nghĩa là tất cả các tham số yêu cầu có tên khớp với tên thuộc tính bean sẽ được chuyển đến các phương thức setter thích hợp.

3

value

Giá trị được gán cho thuộc tính đã cho. Giá trị của tham số là null hoặc tham số không tồn tại, hành động setProperty bị bỏ qua.

4

param

Thuộc tính param là tên của tham số yêu cầu có giá trị mà thuộc tính sẽ nhận. Bạn không thể sử dụng cả giá trị và tham số, nhưng cũng được phép sử dụng cả hai.

Hành động <jsp: getProperty>

Các getProperty action được sử dụng để truy xuất giá trị của một thuộc tính nhất định và chuyển nó thành một chuỗi, và cuối cùng chèn nó vào đầu ra.

Hành động getProperty chỉ có hai thuộc tính, cả hai đều là bắt buộc. Cú pháp của hành động getProperty như sau:

<jsp:useBean id = "myName" ... />
...
<jsp:getProperty name = "myName" property = "someProperty" .../>

Bảng sau liệt kê các thuộc tính bắt buộc được liên kết với getProperty hành động -

Không. Thuộc tính & Mô tả
1

name

Tên của Bean có thuộc tính cần truy xuất. Bean phải được xác định trước đó.

2

property

Thuộc tính property là tên của thuộc tính Bean sẽ được truy xuất.

Thí dụ

Hãy để chúng tôi xác định một bean thử nghiệm sẽ được sử dụng thêm trong ví dụ của chúng tôi -

/* File: TestBean.java */
package action;
 
public class TestBean {
   private String message = "No message specified";
 
   public String getMessage() {
      return(message);
   }
   public void setMessage(String message) {
      this.message = message;
   }
}

Biên dịch mã trên thành mã được tạo TestBean.class và đảm bảo rằng bạn đã sao chép TestBean.class trong C:\apache-tomcat-7.0.2\webapps\WEB-INF\classes\action thư mục và CLASSPATH biến cũng nên được đặt thành thư mục này -

Bây giờ sử dụng mã sau trong main.jsptập tin. Thao tác này tải bean và đặt / nhận một tham số Chuỗi đơn giản -

<html>
   
   <head>
      <title>Using JavaBeans in JSP</title>
   </head>
   
   <body>
      <center>
         <h2>Using JavaBeans in JSP</h2>
         <jsp:useBean id = "test" class = "action.TestBean" />
         <jsp:setProperty name = "test"  property = "message" 
            value = "Hello JSP..." />
            
         <p>Got message....</p>
         <jsp:getProperty name = "test" property = "message" />
      </center>
   </body>
</html>

Bây giờ chúng ta hãy thử truy cập main.jsp, nó sẽ hiển thị kết quả sau:

Using JavaBeans in JSP

Got message.... Hello JSP...

Hành động <jsp: forward>

Các forward hành động chấm dứt hoạt động của trang hiện tại và chuyển tiếp yêu cầu đến một tài nguyên khác như trang tĩnh, trang JSP khác hoặc Java Servlet.

Sau đây là cú pháp của forward hành động -

<jsp:forward page = "Relative URL" />

Bảng sau liệt kê các thuộc tính bắt buộc được liên kết với hành động chuyển tiếp:

Không. Thuộc tính & Mô tả
1

page

Nên bao gồm một URL tương đối của một tài nguyên khác, chẳng hạn như một trang tĩnh, một trang JSP khác hoặc một Java Servlet.

Thí dụ

Hãy để chúng tôi sử dụng lại hai tệp sau (a) date.jsp(b) main.jsp như sau -

Sau đây là nội dung của date.jsp tập tin -

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

Sau đây là nội dung của main.jsp tập tin -

<html>
   <head>
      <title>The include Action Example</title>
   </head>
   
   <body>
      <center>
         <h2>The include action Example</h2>
         <jsp:forward page = "date.jsp" />
      </center>
   </body>
</html>

Bây giờ chúng ta hãy giữ tất cả các tệp này trong thư mục gốc và cố gắng truy cập main.jsp. Điều này sẽ hiển thị kết quả giống như dưới đây.

Ở đây, nó loại bỏ nội dung khỏi trang chính và chỉ hiển thị nội dung từ trang được chuyển tiếp.

Today's date: 12-Sep-2010 14:54:22

Hành động <jsp: plugin>

Các pluginhành động được sử dụng để chèn các thành phần Java vào một trang JSP. Nó xác định loại trình duyệt và chèn<object> hoặc là <embed> nếu cần.

Nếu không có plugin cần thiết, nó sẽ tải xuống plugin và sau đó thực thi thành phần Java. Thành phần Java có thể là một Applet hoặc một JavaBean.

Hành động plugin có một số thuộc tính tương ứng với các thẻ HTML phổ biến được sử dụng để định dạng các thành phần Java. Các<param> cũng có thể được sử dụng để gửi các tham số đến Applet hoặc Bean.

Sau đây là cú pháp điển hình của việc sử dụng hành động plugin:

<jsp:plugin type = "applet" codebase = "dirname" code = "MyApplet.class"
   width = "60" height = "80">
   <jsp:param name = "fontcolor" value = "red" />
   <jsp:param name = "background" value = "black" />
 
   <jsp:fallback>
      Unable to initialize Java Plugin
   </jsp:fallback>
 
</jsp:plugin>

Bạn có thể thử hành động này bằng một số applet nếu bạn quan tâm. Một yếu tố mới,<fallback> , có thể được sử dụng để chỉ định một chuỗi lỗi sẽ được gửi đến người dùng trong trường hợp thành phần bị lỗi.

The <jsp:element> Action

The <jsp:attribute> Action

The <jsp:body> Action

Các <jsp:element>, <jsp:attribute><jsp:body>các hành động được sử dụng để xác định động các phần tử XML. Từ động rất quan trọng, bởi vì nó có nghĩa là các phần tử XML có thể được tạo ra tại thời điểm yêu cầu thay vì tĩnh tại thời điểm biên dịch.

Sau đây là một ví dụ đơn giản để xác định động các phần tử XML:

<%@page language = "java" contentType = "text/html"%>
<html xmlns = "http://www.w3c.org/1999/xhtml"
   xmlns:jsp = "http://java.sun.com/JSP/Page">
   
   <head><title>Generate XML Element</title></head>
   
   <body>
      <jsp:element name = "xmlElement">
         <jsp:attribute name = "xmlElementAttr">
            Value for the attribute
         </jsp:attribute>
         
         <jsp:body>
            Body for XML element
         </jsp:body>
      
      </jsp:element>
   </body>
</html>

Điều này sẽ tạo ra mã HTML sau tại thời điểm chạy:

<html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page">
   <head><title>Generate XML Element</title></head>
   
   <body>
      <xmlElement xmlElementAttr = "Value for the attribute">
         Body for XML element
      </xmlElement>
   </body>
</html>

Hành động <jsp: text>

Các <jsp:text>hành động có thể được sử dụng để viết văn bản mẫu trong các trang và tài liệu JSP. Sau đây là cú pháp đơn giản cho hành động này:

<jsp:text>Template data</jsp:text>

Phần thân của mẫu không được chứa các phần tử khác; nó chỉ có thể chứa văn bản và biểu thức EL (Lưu ý - Biểu thức EL được giải thích trong chương tiếp theo). Lưu ý rằng trong các tệp XML, bạn không thể sử dụng các biểu thức như${whatever > 0}, bởi vì dấu hiệu lớn hơn là bất hợp pháp. Thay vào đó, hãy sử dụnggt hình thức, chẳng hạn như ${whatever gt 0} hoặc một giải pháp thay thế là nhúng giá trị vào CDATA phần.

<jsp:text><![CDATA[<br>]]></jsp:text>

Nếu bạn cần bao gồm một DOCTYPE tuyên bố, ví dụ XHTML, bạn cũng phải sử dụng <jsp:text> phần tử như sau -

<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "DTD/xhtml1-strict.dtd">]]></jsp:text>

   <head><title>jsp:text action</title></head>
   
   <body>
      <books><book><jsp:text>  
         Welcome to JSP Programming
      </jsp:text></book></books>
   </body>
</html>

Hãy thử ví dụ trên có và không <jsp:text> hoạt động.

Trong chương này, chúng ta sẽ thảo luận về các đối tượng ngầm trong JSP. Các đối tượng này là các đối tượng Java mà JSP Container cung cấp cho các nhà phát triển trong mỗi trang và nhà phát triển có thể gọi chúng trực tiếp mà không cần khai báo rõ ràng. Các đối tượng ngầm định của JSP cũng được gọi làpre-defined variables.

Bảng sau liệt kê chín đối tượng ngầm mà JSP hỗ trợ:

Không. Mô tả đối tượng
1

request

Đây là HttpServletRequest đối tượng liên kết với yêu cầu.

2

response

Đây là HttpServletResponse đối tượng kết hợp với phản hồi cho khách hàng.

3

out

Đây là PrintWriter đối tượng được sử dụng để gửi đầu ra cho máy khách.

4

session

Đây là HttpSession đối tượng liên kết với yêu cầu.

5

application

Đây là ServletContext đối tượng liên kết với ngữ cảnh ứng dụng.

6

config

Đây là ServletConfig đối tượng liên kết với trang.

7

pageContext

Điều này bao gồm việc sử dụng các tính năng dành riêng cho máy chủ như hiệu suất cao hơn JspWriters.

số 8

page

Đây chỉ đơn giản là một từ đồng nghĩa với this, và được sử dụng để gọi các phương thức được định nghĩa bởi lớp servlet đã dịch.

9

Exception

Các Exception đối tượng cho phép dữ liệu ngoại lệ được truy cập bởi JSP được chỉ định.

Đối tượng yêu cầu

Đối tượng yêu cầu là một ví dụ của javax.servlet.http.HttpServletRequestvật. Mỗi khi khách hàng yêu cầu một trang, công cụ JSP sẽ tạo một đối tượng mới để đại diện cho yêu cầu đó.

Đối tượng yêu cầu cung cấp các phương thức để lấy thông tin tiêu đề HTTP bao gồm dữ liệu biểu mẫu, cookie, phương thức HTTP, v.v.

Chúng ta có thể trình bày một tập hợp đầy đủ các phương thức được liên kết với đối tượng yêu cầu trong chương tiếp theo - JSP - Yêu cầu máy khách .

Đối tượng phản hồi

Đối tượng phản hồi là một ví dụ của javax.servlet.http.HttpServletResponsevật. Giống như máy chủ tạo đối tượng yêu cầu, nó cũng tạo một đối tượng để đại diện cho phản hồi đối với máy khách.

Đối tượng phản hồi cũng xác định các giao diện xử lý việc tạo tiêu đề HTTP mới. Thông qua đối tượng này, lập trình viên JSP có thể thêm cookie mới hoặc tem ngày, mã trạng thái HTTP, v.v.

Chúng tôi sẽ trình bày một tập hợp đầy đủ các phương thức được liên kết với đối tượng phản hồi trong chương tiếp theo - JSP - Phản hồi của máy chủ .

Đối tượng ra

Đối tượng không tường minh là một ví dụ của javax.servlet.jsp.JspWriter đối tượng và được sử dụng để gửi nội dung trong một phản hồi.

Đối tượng JspWriter ban đầu được khởi tạo khác nhau tùy thuộc vào việc trang có được lưu vào bộ đệm hay không. Có thể dễ dàng tắt bộ đệm bằng cách sử dụngbuffered = 'false' thuộc tính của chỉ thị trang.

Đối tượng JspWriter chứa hầu hết các phương thức giống như java.io.PrintWriterlớp học. Tuy nhiên, JspWriter có một số phương thức bổ sung được thiết kế để giải quyết vấn đề đệm. Không giống như đối tượng PrintWriter, JspWriter némIOExceptions.

Bảng sau liệt kê các phương pháp quan trọng mà chúng ta sẽ sử dụng để viết boolean char, int, double, object, String, Vân vân.

Không. Phương pháp & Mô tả
1

out.print(dataType dt)

In giá trị kiểu dữ liệu

2

out.println(dataType dt)

In một giá trị kiểu dữ liệu sau đó kết thúc dòng bằng ký tự dòng mới.

3

out.flush()

Xả suối.

Đối tượng phiên

Đối tượng phiên là một ví dụ của javax.servlet.http.HttpSession và hoạt động giống hệt như cách mà các đối tượng phiên hoạt động trong Java Servlet.

Đối tượng phiên được sử dụng để theo dõi phiên khách giữa các yêu cầu của khách hàng. Chúng tôi sẽ trình bày cách sử dụng đầy đủ của đối tượng phiên trong chương tiếp theo - JSP - Theo dõi phiên .

Đối tượng ứng dụng

Đối tượng ứng dụng là trình bao bọc trực tiếp xung quanh ServletContext đối tượng cho Servlet được tạo và trong thực tế là một phiên bản của javax.servlet.ServletContext vật.

Đối tượng này là một đại diện của trang JSP thông qua toàn bộ vòng đời của nó. Đối tượng này được tạo khi trang JSP được khởi tạo và sẽ bị xóa khi trang JSP bị xóa bởijspDestroy() phương pháp.

Bằng cách thêm một thuộc tính vào ứng dụng, bạn có thể đảm bảo rằng tất cả các tệp JSP tạo nên ứng dụng web của bạn đều có quyền truy cập vào nó.

Chúng tôi sẽ kiểm tra việc sử dụng Đối tượng ứng dụng trong chương JSP - Bộ đếm lượt truy cập .

Đối tượng cấu hình

Đối tượng cấu hình là một phiên bản của javax.servlet.ServletConfig và là một trình bao bọc trực tiếp xung quanh ServletConfig đối tượng cho servlet đã tạo.

Đối tượng này cho phép lập trình viên JSP truy cập vào các tham số khởi tạo động cơ Servlet hoặc JSP chẳng hạn như đường dẫn hoặc vị trí tệp, v.v.

Sau config là phương thức duy nhất bạn có thể sử dụng và việc sử dụng nó rất nhỏ -

config.getServletName();

Điều này trả về tên servlet, là chuỗi chứa trong <servlet-name> phần tử được xác định trong WEB-INF\web.xml tập tin.

Đối tượng pageContext

Đối tượng pageContext là một ví dụ của javax.servlet.jsp.PageContextvật. Đối tượng pageContext được sử dụng để đại diện cho toàn bộ trang JSP.

Đối tượng này được sử dụng như một phương tiện để truy cập thông tin về trang trong khi tránh hầu hết các chi tiết triển khai.

Đối tượng này lưu trữ các tham chiếu đến các đối tượng yêu cầu và phản hồi cho mỗi yêu cầu. Cácapplication, config, session, và các đối tượng out được dẫn xuất bằng cách truy cập các thuộc tính của đối tượng này.

Đối tượng pageContext cũng chứa thông tin về các chỉ thị được cấp cho trang JSP, bao gồm thông tin đệm, errorPageURL và phạm vi trang.

Lớp PageContext xác định một số trường, bao gồm PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE,APPLICATION_SCOPE, xác định bốn phạm vi. Nó cũng hỗ trợ hơn 40 phương thức, khoảng một nửa trong số đó được kế thừa từjavax.servlet.jsp.JspContext class.

Một trong những phương pháp quan trọng là removeAttribute. Phương thức này chấp nhận một hoặc hai đối số. Ví dụ,pageContext.removeAttribute ("attrName") xóa thuộc tính khỏi tất cả các phạm vi, trong khi đoạn mã sau chỉ xóa thuộc tính khỏi phạm vi trang -

pageContext.removeAttribute("attrName", PAGE_SCOPE);

Việc sử dụng pageContext có thể được kiểm tra trong chương JSP - Tải lên tệp .

Đối tượng trang

Đối tượng này là một tham chiếu thực tế đến phiên bản của trang. Nó có thể được coi như một đối tượng đại diện cho toàn bộ trang JSP.

Đối tượng trang thực sự là một từ đồng nghĩa trực tiếp với this vật.

Đối tượng ngoại lệ

Đối tượng ngoại lệ là một trình bao bọc chứa ngoại lệ được ném từ trang trước. Nó thường được sử dụng để tạo phản hồi thích hợp cho điều kiện lỗi.

Chúng tôi sẽ trình bày cách sử dụng đầy đủ của đối tượng này trong chương JSP - Xử lý ngoại lệ .

Trong chương này, chúng ta sẽ thảo luận về Yêu cầu của Khách hàng trong JSP. Khi trình duyệt yêu cầu một Trang web, nó sẽ gửi rất nhiều thông tin đến máy chủ web. Thông tin này không thể được đọc trực tiếp vì thông tin này truyền đi như một phần của tiêu đề của yêu cầu HTTP. Bạn có thể kiểm tra Giao thức HTTP để biết thêm thông tin về điều này.

Bảng sau liệt kê thông tin tiêu đề quan trọng đến từ trình duyệt. Thông tin này thường được sử dụng trong lập trình web -

Không. Tiêu đề & Mô tả
1

Accept

Tiêu đề này chỉ định MIMEloại mà trình duyệt hoặc các ứng dụng khách khác có thể xử lý. Giá trị củaimage/png hoặc là image/jpeg là hai khả năng phổ biến nhất.

2

Accept-Charset

Tiêu đề này chỉ định các bộ ký tự mà trình duyệt có thể sử dụng để hiển thị thông tin. Ví dụ,ISO-8859-1.

3

Accept-Encoding

Tiêu đề này chỉ định các loại mã hóa mà trình duyệt biết cách xử lý. Giá trị củagzip hoặc là compress là hai khả năng phổ biến nhất.

4

Accept-Language

Tiêu đề này chỉ định các ngôn ngữ ưa thích của khách hàng trong trường hợp servlet có thể tạo ra kết quả bằng nhiều ngôn ngữ. Ví dụen, en-us, ru, Vân vân.

5

Authorization

Tiêu đề này được khách hàng sử dụng để nhận dạng chính họ khi truy cập các trang web được bảo vệ bằng mật khẩu.

6

Connection

Tiêu đề này cho biết liệu máy khách có thể xử lý các kết nối HTTP liên tục hay không. Các kết nối liên tục cho phép ứng dụng khách hoặc trình duyệt khác truy xuất nhiều tệp với một yêu cầu duy nhất. Một giá trị củaKeep-Alive có nghĩa là các kết nối liên tục nên được sử dụng.

7

Content-Length

Tiêu đề này chỉ áp dụng cho POST yêu cầu và cung cấp kích thước của dữ liệu POST tính bằng byte.

số 8

Cookie

Tiêu đề này trả lại cookie cho các máy chủ đã gửi chúng đến trình duyệt trước đó.

9

Host

Tiêu đề này chỉ định máy chủ và cổng như được cung cấp trong URL ban đầu.

10

If-Modified-Since

Tiêu đề này chỉ ra rằng khách hàng chỉ muốn trang nếu nó đã được thay đổi sau ngày được chỉ định. Máy chủ gửi mã, 304 có nghĩa làNot Modified header if no newer result is available.

11

If-Unmodified-Since

This header is the reverse of If-Modified-Since; it specifies that the operation should succeed only if the document is older than the specified date.

12

Referer

This header indicates the URL of the referring webpages. For example, if you are at Webpage 1 and click on a link to Webpage 2, the URL of Webpage 1 is included in the Referer header when the browser requests Webpage 2.

13

User-Agent

This header identifies the browser or other client making the request and can be used to return different content to different types of browsers.

The HttpServletRequest Object

The request object is an instance of a javax.servlet.http.HttpServletRequest object. Each time a client requests a page, the JSP engine creates a new object to represent that request.

The request object provides methods to get HTTP header information including form data, cookies, HTTP methods, etc.

Following table lists out the important methods that can be used to read HTTP header in your JSP program. These methods are available with HttpServletRequest object which represents client request to webserver.

S.No. Method & Description
1

Cookie[] getCookies()

Returns an array containing all of the Cookie objects the client sent with this request.

2

Enumeration getAttributeNames()

Returns an Enumeration containing the names of the attributes available to this request.

3

Enumeration getHeaderNames()

Returns an enumeration of all the header names this request contains.

4

Enumeration getParameterNames()

Returns an enumeration of String objects containing the names of the parameters contained in this request.

5

HttpSession getSession()

Returns the current session associated with the this request, or if the request does not have a session, creates one.

6

HttpSession getSession(boolean create)

Returns the current HttpSession associated with the this request or, if if there is no current session and create is true, returns a new session.

7

Locale getLocale()

Returns the preferred Locale that the client will accept content in, based on the Accept-Language header.

8

Object getAttribute(String name)

Returns the value of the named attribute as an Object, or null if no attribute of the given name exists.

9

ServletInputStream getInputStream()

Retrieves the body of the request as binary data using a ServletInputStream.

10

String getAuthType()

Returns the name of the authentication scheme used to protect the servlet, for example, "BASIC" or "SSL," or null if the JSP was not protected.

11

String getCharacterEncoding()

Returns the name of the character encoding used in the body of this request.

12

String getContentType()

Returns the MIME type of the body of the request, or null if the type is not known.

13

String getContextPath()

Returns the portion of the request URI that indicates the context of the request.

14

String getHeader(String name)

Returns the value of the specified request header as a String.

15

String getMethod()

Returns the name of the HTTP method with which this request was made, for example, GET, POST, or PUT.

16

String getParameter(String name)

Returns the value of a request parameter as a String, or null if the parameter does not exist.

17

String getPathInfo()

Returns any extra path information associated with the URL the client sent when it made this request.

18

String getProtocol()

Returns the name and version of the protocol the request uses.

19

String getQueryString()

Returns the query string that is contained in the request URL after the path.

20

String getRemoteAddr()

Returns the Internet Protocol (IP) address of the client that sent the request.

21

String getRemoteHost()

Returns the fully qualified name of the client that sent the request.

22

String getRemoteUser()

Returns the login of the user making this request, if the user has been authenticated, or null if the user has not been authenticated.

23

String getRequestURI()

Returns the part of this request's URL from the protocol name up to the query string in the first line of the HTTP request.

24

String getRequestedSessionId()

Returns the session ID specified by the client.

25

String getServletPath()

Returns the part of this request's URL that calls the JSP.

26

String[] getParameterValues(String name)

Returns an array of String objects containing all of the values the given request parameter has, or null if the parameter does not exist.

27

boolean isSecure()

Returns a boolean indicating whether this request was made using a secure channel, such as HTTPS.

28

int getContentLength()

Returns the length, in bytes, of the request body and made available by the input stream, or -1 if the length is not known.

29

int getIntHeader(String name)

Returns the value of the specified request header as an int.

30

int getServerPort()

Returns the port number on which this request was received.

HTTP Header Request Example

Following is the example which uses getHeaderNames() method of HttpServletRequest to read the HTTP header information. This method returns an Enumeration that contains the header information associated with the current HTTP request.

Once we have an Enumeration, we can loop down the Enumeration in the standard manner. We will use the hasMoreElements() method to determine when to stop and the nextElement() method to get the name of each parameter name.

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>HTTP Header Request Example</title>
   </head>

   <body>
      <center>
         <h2>HTTP Header Request Example</h2>
         
         <table width = "100%" border = "1" align = "center">
            <tr bgcolor = "#949494">
               <th>Header Name</th>
               <th>Header Value(s)</th>
            </tr>
            <%
               Enumeration headerNames = request.getHeaderNames();
               while(headerNames.hasMoreElements()) {
                  String paramName = (String)headerNames.nextElement();
                  out.print("<tr><td>" + paramName + "</td>\n");
                  String paramValue = request.getHeader(paramName);
                  out.println("<td> " + paramValue + "</td></tr>\n");
               }
            %>
         </table>
      </center>
   
   </body>
</html>

Let us now put the above code in main.jsp and try to access it.

HTTP Header Request Example

Header Name Header Value(s)
accept */*
accept-language en-us
user-agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8)
accept-encoding gzip, deflate
host localhost:8080
connection Keep-Alive
cache-control no-cache

You can try working on all the methods in a similar way.

In this chapter, we will discuss the Server Response in JSP. When a Web server responds to a HTTP request, the response typically consists of a status line, some response headers, a blank line, and the document. A typical response looks like this −

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
   (Blank Line)
<!doctype ...>

<html>
   <head>...</head>
   <body>
      ...
   </body>
</html>

The status line consists of the HTTP version (HTTP/1.1 in the example), a status code (200 in the example), and a very short message corresponding to the status code (OK in the example).

Following is a summary of the most useful HTTP 1.1 response headers which go back to the browser from the web server. These headers are frequently used in web programming −

S.No. Header & Description
1

Allow

This header specifies the request methods (GET, POST, etc.) that the server supports.

2

Cache-Control

This header specifies the circumstances in which the response document can safely be cached. It can have values public, private or no-cache etc. Public means document is cacheable, Private means document is for a single user and can only be stored in private (nonshared) caches and no-cache means document should never be cached.

3

Connection

This header instructs the browser whether to use persistent HTTP connections or not. A value of close instructs the browser not to use persistent HTTP connections and keep-alive means using persistent connections.

4

Content-Disposition

This header lets you request that the browser ask the user to save the response to disk in a file of the given name.

5

Content-Encoding

This header specifies the way in which the page was encoded during transmission.

6

Content-Language

This header signifies the language in which the document is written. For example, en, en-us, ru, etc.

7

Content-Length

This header indicates the number of bytes in the response. This information is needed only if the browser is using a persistent (keep-alive) HTTP connection.

8

Content-Type

This header gives the MIME (Multipurpose Internet Mail Extension) type of the response document.

9

Expires

This header specifies the time at which the content should be considered out-of-date and thus no longer be cached.

10

Last-Modified

This header indicates when the document was last changed. The client can then cache the document and supply a date by an If-Modified-Since request header in later requests.

11

Location

This header should be included with all responses that have a status code in the 300s. This notifies the browser of the document address. The browser automatically reconnects to this location and retrieves the new document.

12

Refresh

This header specifies how soon the browser should ask for an updated page. You can specify time in number of seconds after which a page would be refreshed.

13

Retry-After

This header can be used in conjunction with a 503 (Service Unavailable) response to tell the client how soon it can repeat its request.

14

Set-Cookie

This header specifies a cookie associated with the page.

The HttpServletResponse Object

The response object is an instance of a javax.servlet.http.HttpServletResponse object. Just as the server creates the request object, it also creates an object to represent the response to the client.

The response object also defines the interfaces that deal with creating new HTTP headers. Through this object, the JSP programmer can add new cookies or date stamps, HTTP status codes etc.

The following methods can be used to set HTTP response header in your servlet program. These methods are available with the HttpServletResponse object. This object represents the server response.

S.No. Method & Description
1

String encodeRedirectURL(String url)

Encodes the specified URL for use in the sendRedirect method or, if encoding is not needed, returns the URL unchanged.

2

String encodeURL(String url)

Encodes the specified URL by including the session ID in it, or, if encoding is not needed, returns the URL unchanged.

3

boolean containsHeader(String name)

Returns a boolean indicating whether the named response header has already been set.

4

boolean isCommitted()

Returns a boolean indicating if the response has been committed.

5

void addCookie(Cookie cookie)

Adds the specified cookie to the response.

6

void addDateHeader(String name, long date)

Adds a response header with the given name and date-value.

7

void addHeader(String name, String value)

Adds a response header with the given name and value.

8

void addIntHeader(String name, int value)

Adds a response header with the given name and integer value.

9

void flushBuffer()

Forces any content in the buffer to be written to the client.

10

void reset()

Clears any data that exists in the buffer as well as the status code and headers.

11

void resetBuffer()

Clears the content of the underlying buffer in the response without clearing headers or status code.

12

void sendError(int sc)

Sends an error response to the client using the specified status code and clearing the buffer.

13

void sendError(int sc, String msg)

Sends an error response to the client using the specified status.

14

void sendRedirect(String location)

Sends a temporary redirect response to the client using the specified redirect location URL.

15

void setBufferSize(int size)

Sets the preferred buffer size for the body of the response.

16

void setCharacterEncoding(String charset)

Sets the character encoding (MIME charset) of the response being sent to the client, for example, to UTF-8.

17

void setContentLength(int len)

Sets the length of the content body in the response In HTTP servlets; this method also sets the HTTP Content-Length header.

18

void setContentType(String type)

Sets the content type of the response being sent to the client, if the response has not been committed yet.

19

void setDateHeader(String name, long date)

Sets a response header with the given name and date-value.

20

void setHeader(String name, String value)

Sets a response header with the given name and value.

21

void setIntHeader(String name, int value)

Sets a response header with the given name and integer value.

22

void setLocale(Locale loc)

Sets the locale of the response, if the response has not been committed yet.

23

void setStatus(int sc)

Sets the status code for this response.

HTTP Header Response Example

Following example would use setIntHeader() method to set Refresh header to simulate a digital clock −

<%@ page import = "java.io.*,java.util.*" %>

<html>
   
   <head>
      <title>Auto Refresh Header Example</title>
   </head>
   
   <body>
      <center>
         <h2>Auto Refresh Header Example</h2>
         <%
            // Set refresh, autoload time as 5 seconds
            response.setIntHeader("Refresh", 5);
            
            // Get current time
            Calendar calendar = new GregorianCalendar();
            
            String am_pm;
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);
            
            if(calendar.get(Calendar.AM_PM) == 0) 
               am_pm = "AM";
            else
               am_pm = "PM";
               String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
               out.println("Current Time is: " + CT + "\n");
         %>
      </center>
   
   </body>
</html>

Now put the above code in main.jsp and try to access it. This will display the current system time after every 5 seconds as follows. Run the JSP. You will receive the following output: −

Auto Refresh Header Example

Current Time is: 9:44:50 PM

You can try working out on the other methods in a similar way.

In this chapter, we will discuss the Http Status Codes in JSP. The format of the HTTP request and the HTTP response messages are similar and will have the following structure −

  • An initial status line + CRLF (Carriage Return + Line Feed ie. New Line)

  • Zero or more header lines + CRLF

  • A blank line ie. a CRLF

  • An optional message body like file, query data or query output.

For example, a server response header looks like the following −

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
   (Blank Line)
<!doctype ...>

<html>
   <head>...</head>
   
   <body>
      ...
   </body>
</html>

The status line consists of the HTTP version (HTTP/1.1 in the example), a status code (200 in the example), and a very short message corresponding to the status code (OK in the example).

Following table lists out the HTTP status codes and associated messages that might be returned from the Web Server −

Code Message Description
100 Continue Only a part of the request has been received by the server, but as long as it has not been rejected, the client should continue with the request
101 Switching Protocols The server switches protocol.
200 OK The request is OK
201 Created The request is complete, and a new resource is created 
202 Accepted The request is accepted for processing, but the processing is not complete.
203 Non-authoritative Information
204 No Content
205 Reset Content
206 Partial Content
300 Multiple Choices A link list; the user can select a link and go to that location. Maximum five addresses.
301 Moved Permanently The requested page has moved to a new url.
302 Found The requested page has moved temporarily to a new url.
303 See Other The requested page can be found under a different url.
304 Not Modified
305 Use Proxy
306 Unused This code was used in a previous version. It is no longer used, but the code is reserved.
307 Temporary Redirect The requested page has moved temporarily to a new url.
400 Bad Request The server did not understand the request.
401 Unauthorized The requested page needs a username and a password.
402 Payment Required You can not use this code yet.
403 Forbidden Access is forbidden to the requested page
404 Not Found The server can not find the requested page.
405 Method Not Allowed The method specified in the request is not allowed.
406 Not Acceptable The server can only generate a response that is not accepted by the client.
407 Proxy Authentication Required You must authenticate with a proxy server before this request can be served.
408 Request Timeout The request took longer than the server was prepared to wait.
409 Conflict The request could not be completed because of a conflict.
410 Gone The requested page is no longer available.
411 Length Required The "Content-Length" is not defined. The server will not accept the request without it.
412 Precondition Failed The precondition given in the request evaluated to false by the server.
413 Request Entity Too Large The server will not accept the request, because the request entity is too large.
414 Request-url Too Long The server will not accept the request, because the url is too long. This occurs when you convert a "post" request to a "get" request with a long query information.
415 Unsupported Media Type The server will not accept the request, because the media type is not supported.
417 Expectation Failed
500 Internal Server Error The request was not completed. The server met an unexpected condition.
501 Not Implemented The request was not completed. The server did not support the functionality required.
502 Bad Gateway The request was not completed. The server received an invalid response from the upstream server.
503 Service Unavailable The request was not completed. The server is temporarily overloading or down.
504 Gateway Timeout The gateway has timed out.
505 HTTP Version Not Supported The server does not support the "http protocol" version.

Methods to Set HTTP Status Code

Following methods can be used to set the HTTP Status Code in your servlet program. These methods are available with the HttpServletResponse object.

S.No. Method & Description
1

public void setStatus ( int statusCode )

This method sets an arbitrary status code. The setStatus method takes an int (the status code) as an argument. If your response includes a special status code and a document, be sure to call setStatus before actually returning any of the content with the PrintWriter.

2

public void sendRedirect(String url)

This method generates a 302 response along with a Location header giving the URL of the new document.

3

public void sendError(int code, String message)

This method sends a status code (usually 404) along with a short message that is automatically formatted inside an HTML document and sent to the client.

HTTP Status Code Example

Following example shows how a 407 error code is sent to the client browser. After this, the browser would show you "Need authentication!!!" message.

<html>
   <head>
      <title>Setting HTTP Status Code</title>
   </head>
   
   <body>
      <%
         // Set error code and reason.
         response.sendError(407, "Need authentication!!!" );
      %>
   </body>
</html>

You will receive the following output −

HTTP Status 407 - Need authentication!!!

type Status report

message Need authentication!!!

description The client must first authenticate itself with the proxy (Need authentication!!!).

Apache Tomcat/5.5.29

To become more comfortable with HTTP status codes, try to set different status codes and their description.

In this chapter, we will discuss Form Processing in JSP. You must have come across many situations when you need to pass some information from your browser to the web server and ultimately to your backend program. The browser uses two methods to pass this information to the web server. These methods are the GET Method and the POST Method.

The Methods in Form Processing

Let us now discuss the methods in Form Processing.

GET method

The GET method sends the encoded user information appended to the page request. The page and the encoded information are separated by the ? character as follows −

http://www.test.com/hello?key1=value1&key2=value2

The GET method is the default method to pass information from the browser to the web server and it produces a long string that appears in your browser's Location:box. It is recommended that the GET method is better not used. if you have password or other sensitive information to pass to the server.

The GET method has size limitation: only 1024 characters can be in a request string.

This information is passed using QUERY_STRING header and will be accessible through QUERY_STRING environment variable which can be handled using getQueryString() and getParameter() methods of request object.

POST method

A generally more reliable method of passing information to a backend program is the POST method.

This method packages the information in exactly the same way as the GET method, but instead of sending it as a text string after a ? in the URL it sends it as a separate message. This message comes to the backend program in the form of the standard input which you can parse and use for your processing.

JSP handles this type of requests using getParameter() method to read simple parameters and getInputStream() method to read binary data stream coming from the client.

Reading Form Data using JSP

JSP handles form data parsing automatically using the following methods depending on the situation −

  • getParameter() − You call request.getParameter() method to get the value of a form parameter.

  • getParameterValues() − Call this method if the parameter appears more than once and returns multiple values, for example checkbox.

  • getParameterNames() − Call this method if you want a complete list of all parameters in the current request.

  • getInputStream() − Call this method to read binary data stream coming from the client.

GET Method Example Using URL

The following URL will pass two values to HelloForm program using the GET method.

http://localhost:8080/main.jsp?first_name=ZARA&last_name=ALI

Below is the main.jsp JSP program to handle input given by web browser. We are going to use the getParameter() method which makes it very easy to access the passed information −

<html>
   <head>
      <title>Using GET Method to Read Form Data</title>
   </head>
   
   <body>
      <h1>Using GET Method to Read Form Data</h1>
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

Now type http://localhost:8080/main.jsp?first_name=ZARA&last_name=ALI in your browser's Location:box. This will generate the following result −

Using GET Method to Read Form Data

  • First Name: ZARA

  • Last Name: ALI

GET Method Example Using Form

Following is an example that passes two values using the HTML FORM and the submit button. We are going to use the same JSP main.jsp to handle this input.

<html>
   <body>
      
      <form action = "main.jsp" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
      
   </body>
</html>

Keep this HTML in a file Hello.htm and put it in <Tomcat-installation-directory>/webapps/ROOT directory. When you would access http://localhost:8080/Hello.htm, you will receive the following output.

POST Method Example Using Form

Let us do a little modification in the above JSP to handle both the GET and the POST method. Below is the main.jsp JSP program to handle the input given by web browser using the GET or the POST methods.

Infact there is no change in the above JSP because the only way of passing parameters is changed and no binary data is being passed to the JSP program. File handling related concepts will be explained in separate chapter where we need to read the binary data stream.

<html>
   <head>
      <title>Using GET and POST Method to Read Form Data</title>
   </head>
   
   <body>
      <center>
      <h1>Using POST Method to Read Form Data</h1>
      
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

Following is the content of the Hello.htm file −

<html>
   <body>
      
      <form action = "main.jsp" method = "POST">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
      
   </body>
</html>

Let us now keep main.jsp and hello.htm in <Tomcat-installationdirectory>/webapps/ROOT directory. When you access http://localhost:8080/Hello.htm, you will receive the following output.

Try to enter the First and the Last Name and then click the submit button to see the result on your local machine where tomcat is running.

Based on the input provided, you will receive similar results as in the above examples.

Passing Checkbox Data to JSP Program

Checkboxes are used when more than one option is required to be selected.

Following is an example HTML code, CheckBox.htm, for a form with two checkboxes.

<html>
   <body>
      
      <form action = "main.jsp" method = "POST" target = "_blank">
         <input type = "checkbox" name = "maths" checked = "checked" /> Maths
         <input type = "checkbox" name = "physics"  /> Physics
         <input type = "checkbox" name = "chemistry" checked = "checked" /> Chemistry
         <input type = "submit" value = "Select Subject" />
      </form>
      
   </body>
</html>

The above code will generate the following result −

Following is main.jsp JSP program to handle the input given by the web browser for the checkbox button.

<html>
   <head>
      <title>Reading Checkbox Data</title>
   </head>
   
   <body>
      <h1>Reading Checkbox Data</h1>
      
      <ul>
         <li><p><b>Maths Flag:</b>
            <%= request.getParameter("maths")%>
         </p></li>
         <li><p><b>Physics Flag:</b>
            <%= request.getParameter("physics")%>
         </p></li>
         <li><p><b>Chemistry Flag:</b>
            <%= request.getParameter("chemistry")%>
         </p></li>
      </ul>
   
   </body>
</html>

The above program will generate the following result −

Reading Checkbox Data

  • Maths Flag :: on

  • Physics Flag:: null

  • Chemistry Flag:: on

Reading All Form Parameters

Following is a generic example which uses getParameterNames() method of HttpServletRequest to read all the available form parameters. This method returns an Enumeration that contains the parameter names in an unspecified order.

Once we have an Enumeration, we can loop down the Enumeration in the standard manner, using the hasMoreElements() method to determine when to stop and using the nextElement() method to get each parameter name.

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>HTTP Header Request Example</title>
   </head>

   <body>
      <center>
         <h2>HTTP Header Request Example</h2>
         <table width = "100%" border = "1" align = "center">
            <tr bgcolor = "#949494">
               <th>Param Name</th>
               <th>Param Value(s)</th>
            </tr>
            <%
               Enumeration paramNames = request.getParameterNames();
               while(paramNames.hasMoreElements()) {
                  String paramName = (String)paramNames.nextElement();
                  out.print("<tr><td>" + paramName + "</td>\n");
                  String paramValue = request.getHeader(paramName);
                  out.println("<td> " + paramValue + "</td></tr>\n");
               }
            %>
         </table>
      </center>
   
   </body>
</html>

Sau đây là nội dung của Hello.htm -

<html>
   <body>
      
      <form action = "main.jsp" method = "POST" target = "_blank">
         <input type = "checkbox" name = "maths" checked = "checked" /> Maths
         <input type = "checkbox" name = "physics"  /> Physics
         <input type = "checkbox" name = "chemistry" checked = "checked" /> Chem
         <input type = "submit" value = "Select Subject" />
      </form>
   
   </body>
</html>

Bây giờ hãy thử gọi JSP bằng Hello.htm ở trên; điều này sẽ tạo ra một kết quả giống như bên dưới dựa trên đầu vào được cung cấp -

Đọc tất cả các tham số biểu mẫu

Tên tham số Giá trị tham số
toán học trên
hóa học trên

Bạn có thể thử JSP ở trên để đọc bất kỳ dữ liệu nào khác của biểu mẫu có các đối tượng khác như hộp văn bản, nút radio hoặc menu thả xuống, v.v.

Trong chương này, chúng ta sẽ thảo luận về Bộ lọc trong JSP. Bộ lọc Servlet và JSP là các lớp Java có thể được sử dụng trong Lập trình Servlet và JSP cho các mục đích sau:

  • Để chặn các yêu cầu từ máy khách trước khi họ truy cập tài nguyên ở phía sau.

  • Để thao tác các phản hồi từ máy chủ trước khi chúng được gửi lại cho máy khách.

Có nhiều loại bộ lọc khác nhau được đề xuất bởi các thông số kỹ thuật -

  • Bộ lọc xác thực
  • Bộ lọc nén dữ liệu
  • Bộ lọc mã hóa
  • Bộ lọc kích hoạt các sự kiện truy cập tài nguyên
  • Bộ lọc chuyển đổi hình ảnh
  • Bộ lọc ghi nhật ký và kiểm toán
  • Bộ lọc chuỗi MIME-TYPE
  • Mã hóa bộ lọc
  • Bộ lọc XSL / T chuyển đổi nội dung XML

Bộ lọc được triển khai trong tệp mô tả triển khai web.xmlvà sau đó ánh xạ tới tên servlet hoặc JSP hoặc các mẫu URL trong bộ mô tả triển khai ứng dụng của bạn. Tệp bộ mô tả triển khai web.xml có thể được tìm thấy trong thư mục <Tomcat-installation-directory> \ conf .

Khi vùng chứa JSP khởi động ứng dụng web của bạn, nó sẽ tạo một phiên bản của từng bộ lọc mà bạn đã khai báo trong bộ mô tả triển khai. Các bộ lọc thực thi theo thứ tự mà chúng được khai báo trong bộ mô tả triển khai.

Phương pháp lọc Servlet

Bộ lọc chỉ đơn giản là một lớp Java thực hiện javax.servlet.Filtergiao diện. Giao diện javax.servlet.Filter xác định ba phương thức:

Không. Phương pháp & Mô tả
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Phương thức này được vùng chứa gọi mỗi khi một cặp yêu cầu / phản hồi được chuyển qua chuỗi do yêu cầu của khách hàng đối với tài nguyên ở cuối chuỗi.

2

public void init(FilterConfig filterConfig)

Phương thức này được gọi bởi vùng chứa web để chỉ ra với bộ lọc rằng nó đang được đưa vào dịch vụ.

3

public void destroy()

Phương thức này được gọi bởi vùng chứa web để cho biết với bộ lọc rằng nó đang được đưa ra khỏi dịch vụ.

Ví dụ về bộ lọc JSP

Ví dụ sau cho thấy cách in địa chỉ IP của khách hàng và ngày giờ hiện tại, mỗi lần nó sẽ truy cập vào bất kỳ tệp JSP nào. Ví dụ này sẽ cung cấp cho bạn hiểu biết cơ bản về Bộ lọc JSP, nhưng bạn có thể viết các ứng dụng bộ lọc phức tạp hơn bằng cách sử dụng cùng một khái niệm -

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 
 
      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws java.io.IOException, ServletException {
      
      // Get the IP address of client machine.   
      String ipAddress = request.getRemoteAddr();
      
      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());
      
      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   public void destroy( ) {
      /* Called before the Filter instance is removed 
      from service by the web container*/
   }
}

Biên dịch LogFilter.java theo cách thông thường và đặt LogFilter.class trong tập tin <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Ánh xạ bộ lọc JSP trong Web.xml

Các bộ lọc được xác định và sau đó được ánh xạ tới một URL hoặc tên tệp JSP, theo cách giống như Servlet được định nghĩa và sau đó được ánh xạ tới một mẫu URL trong web.xmltập tin. Tạo mục nhập sau cho thẻ bộ lọc trong tệp mô tả triển khaiweb.xml

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Bộ lọc trên sẽ áp dụng cho tất cả các servlet và JSP vì chúng tôi đã chỉ định /*trong cấu hình của chúng tôi. Bạn có thể chỉ định một servlet cụ thể hoặc đường dẫn JSP nếu bạn muốn áp dụng bộ lọc trên một vài servlet hoặc chỉ JSP.

Bây giờ hãy thử gọi bất kỳ servlet hoặc JSP nào và bạn sẽ thấy nhật ký được tạo trong nhật ký máy chủ web của bạn. Bạn có thể dùngLog4J logger để đăng nhập ở trên đăng nhập vào một tệp riêng biệt.

Sử dụng nhiều bộ lọc

Ứng dụng web của bạn có thể xác định một số bộ lọc khác nhau với một mục đích cụ thể. Hãy xem xét, bạn xác định hai bộ lọc AuthenFilterLogFilter . Phần còn lại của quá trình sẽ vẫn như được giải thích ở trên ngoại trừ bạn cần tạo một ánh xạ khác như được đề cập bên dưới -

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
 
<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
 
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Đơn đặt hàng bộ lọc

Thứ tự của các phần tử ánh xạ bộ lọc trong web.xml xác định thứ tự trong đó vùng chứa web áp dụng bộ lọc cho servlet hoặc JSP. Để đảo ngược thứ tự của bộ lọc, bạn chỉ cần đảo ngược các phần tử ánh xạ bộ lọc trongweb.xml tập tin.

Ví dụ, ví dụ trên sẽ áp dụng LogFilter đầu tiên và sau đó nó sẽ áp dụng AuthenFilter cho bất kỳ servlet hoặc JSP nào; ví dụ sau sẽ đảo ngược thứ tự -

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Trong chương này, chúng ta sẽ thảo luận về Xử lý Cookie trong JSP. Cookie là các tệp văn bản được lưu trữ trên máy tính của khách hàng và chúng được lưu giữ cho các mục đích theo dõi thông tin khác nhau. JSP hỗ trợ rõ ràng cookie HTTP bằng cách sử dụng công nghệ servlet cơ bản.

Có ba bước liên quan đến việc xác định và người dùng cũ -

  • Tập lệnh máy chủ gửi một tập hợp các cookie đến trình duyệt. Ví dụ: tên, tuổi hoặc số nhận dạng, v.v.

  • Trình duyệt lưu trữ thông tin này trên máy cục bộ để sử dụng trong tương lai.

  • Khi lần tiếp theo trình duyệt gửi bất kỳ yêu cầu nào đến máy chủ web thì nó sẽ gửi thông tin cookie đó đến máy chủ và máy chủ sử dụng thông tin đó để xác định người dùng hoặc có thể cho một số mục đích khác.

Chương này sẽ hướng dẫn bạn cách thiết lập hoặc đặt lại cookie, cách truy cập chúng và cách xóa chúng bằng các chương trình JSP.

Giải phẫu của một cookie

Cookie thường được đặt trong tiêu đề HTTP (mặc dù JavaScript cũng có thể đặt cookie trực tiếp trên trình duyệt). JSP đặt cookie có thể gửi tiêu đề trông giống như thế này -

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT; 
   path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html

Như bạn có thể thấy, Set-Cookie header chứa đựng a name value pair, a GMT date, a patha domain. Tên và giá trị sẽ được mã hóa URL. Cácexpires trường là một chỉ dẫn cho trình duyệt để "forget" cookie sau thời gian và ngày nhất định.

Nếu trình duyệt được định cấu hình để lưu trữ cookie, thì trình duyệt sẽ giữ thông tin này cho đến ngày hết hạn. Nếu người dùng trỏ trình duyệt đến bất kỳ trang nào phù hợp với đường dẫn và miền của cookie, nó sẽ gửi lại cookie đến máy chủ. Tiêu đề của trình duyệt có thể trông giống như thế này -

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126

Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz

Tập lệnh JSP sau đó sẽ có quyền truy cập vào cookie thông qua phương thức yêu cầu request.getCookies()trả về một mảng các đối tượng Cookie .

Phương thức cookie Servlet

Bảng sau liệt kê các phương thức hữu ích được liên kết với đối tượng Cookie mà bạn có thể sử dụng khi thao tác với cookie trong JSP:

Không. Phương pháp & Mô tả
1

public void setDomain(String pattern)

Phương pháp này đặt miền áp dụng cookie; ví dụ: tutorialspoint.com.

2

public String getDomain()

Phương pháp này nhận miền mà cookie áp dụng; ví dụ: tutorialspoint.com.

3

public void setMaxAge(int expiry)

Phương pháp này đặt thời gian (tính bằng giây) sẽ trôi qua trước khi cookie hết hạn. Nếu bạn không đặt điều này, cookie sẽ chỉ tồn tại trong phiên hiện tại.

4

public int getMaxAge()

Phương thức này trả về tuổi tối đa của cookie, được chỉ định bằng giây, Theo mặc định, -1 cho biết cookie sẽ tồn tại cho đến khi trình duyệt tắt.

5

public String getName()

Phương thức này trả về tên của cookie. Không thể thay đổi tên sau khi tạo.

6

public void setValue(String newValue)

Phương pháp này đặt giá trị được liên kết với cookie.

7

public String getValue()

Phương thức này nhận giá trị được liên kết với cookie.

số 8

public void setPath(String uri)

Phương pháp này đặt đường dẫn mà cookie này áp dụng. Nếu bạn không chỉ định đường dẫn, cookie sẽ được trả về cho tất cả các URL trong cùng thư mục với trang hiện tại cũng như tất cả các thư mục con.

9

public String getPath()

Phương thức này lấy đường dẫn mà cookie này áp dụng.

10

public void setSecure(boolean flag)

Phương thức này đặt giá trị boolean cho biết liệu cookie chỉ nên được gửi qua các kết nối được mã hóa (tức là SSL).

11

public void setComment(String purpose)

Phương thức này chỉ định một nhận xét mô tả mục đích của cookie. Nhận xét hữu ích nếu trình duyệt hiển thị cookie cho người dùng.

12

public String getComment()

Phương thức này trả về bình luận mô tả mục đích của cookie này hoặc vô hiệu nếu cookie không có bình luận.

Cài đặt Cookie với JSP

Đặt cookie với JSP bao gồm ba bước:

Bước 1: Tạo đối tượng Cookie

Bạn gọi hàm tạo Cookie với tên cookie và giá trị cookie, cả hai đều là chuỗi.

Cookie cookie = new Cookie("key","value");

Xin lưu ý rằng tên và giá trị không được chứa khoảng trắng hoặc bất kỳ ký tự nào sau đây -

[ ] ( ) = , " / ? @ : ;

Bước 2: Đặt độ tuổi tối đa

Bạn dùng setMaxAgeđể chỉ định thời gian (tính bằng giây) cookie sẽ hợp lệ. Đoạn mã sau sẽ thiết lập một cookie trong 24 giờ.

cookie.setMaxAge(60*60*24);

Bước 3: Gửi Cookie vào các tiêu đề phản hồi HTTP

Bạn dùng response.addCookie để thêm cookie trong tiêu đề phản hồi HTTP như sau

response.addCookie(cookie);

Thí dụ

Hãy để chúng tôi sửa đổi Ví dụ về Biểu mẫu của chúng tôi để đặt cookie cho họ và tên.

<%
   // Create cookies for first and last names.      
   Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
   Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
   
   // Set expiry date after 24 Hrs for both the cookies.
   firstName.setMaxAge(60*60*24); 
   lastName.setMaxAge(60*60*24); 
   
   // Add both the cookies in the response header.
   response.addCookie( firstName );
   response.addCookie( lastName );
%>

<html>
   <head>
      <title>Setting Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Setting Cookies</h1>
      </center>
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

Hãy để chúng tôi đưa đoạn mã trên vào main.jsp và sử dụng nó trong trang HTML sau:

<html>
   <body>
      
      <form action = "main.jsp" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
      
   </body>
</html>

Giữ nội dung HTML ở trên trong một tệp hello.jsp và đặt hello.jspmain.jsp trong <Tomcat-installation-directory>/webapps/ROOTdanh mục. Khi nào bạn sẽ truy cậphttp://localhost:8080/hello.jsp, đây là kết quả thực tế của biểu mẫu trên.

Cố gắng nhập Tên và Họ rồi nhấp vào nút gửi. Thao tác này sẽ hiển thị tên và họ trên màn hình của bạn và cũng sẽ đặt hai cookiefirstNamelastName. Các cookie này sẽ được chuyển trở lại máy chủ khi bạn nhấp vào nút Gửi vào lần tiếp theo.

Trong phần tiếp theo, chúng tôi sẽ giải thích cách bạn có thể truy cập lại các cookie này trong ứng dụng web của mình.

Đọc Cookies với JSP

Để đọc cookie, bạn cần tạo một mảng các đối tượng javax.servlet.http.Cookie bằng cách gọigetCookies( )phương thức của HttpServletRequest . Sau đó xoay vòng qua mảng và sử dụnggetName()getValue() các phương pháp để truy cập từng cookie và giá trị liên quan.

Thí dụ

Bây giờ chúng ta hãy đọc các cookie đã được đặt trong ví dụ trước -

<html>
   <head>
      <title>Reading Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Reading Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;
         
         // Get an array of Cookies associated with the this domain
         cookies = request.getCookies();
         
         if( cookies != null ) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println("<h2>No cookies founds</h2>");
         }
      %>
   </body>
   
</html>

Bây giờ chúng ta hãy đặt đoạn mã trên vào main.jspvà cố gắng truy cập nó. Nếu bạn đặtfirst_name cookie là "John" và last_name cookie là "Người chơi" sau đó chạy http://localhost:8080/main.jsp sẽ hiển thị kết quả sau:

Found Cookies Name and Value

Name : first_name, Value: John

Name : last_name, Value: Player

Xóa cookie bằng JSP

Để xóa cookie rất đơn giản. Nếu bạn muốn xóa cookie, bạn chỉ cần làm theo ba bước sau:

  • Đọc một cookie đã có và lưu trữ nó trong đối tượng Cookie.

  • Đặt tuổi cookie bằng 0 bằng cách sử dụng setMaxAge() phương pháp xóa một cookie hiện có.

  • Thêm lại cookie này vào tiêu đề phản hồi.

Thí dụ

Ví dụ sau sẽ chỉ cho bạn cách xóa một cookie hiện có có tên "first_name" và khi bạn chạy main.jsp JSP vào lần sau, nó sẽ trả về giá trị null cho first_name.

<html>
   <head>
      <title>Reading Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Reading Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;
         
         // Get an array of Cookies associated with the this domain
         cookies = request.getCookies();
         
         if( cookies != null ) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               
               if((cookie.getName( )).compareTo("first_name") == 0 ) {
                  cookie.setMaxAge(0);
                  response.addCookie(cookie);
                  out.print("Deleted cookie: " + 
                  cookie.getName( ) + "<br/>");
               }
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println(
            "<h2>No cookies founds</h2>");
         }
      %>
   </body>
   
</html>

Bây giờ chúng ta hãy đặt đoạn mã trên vào main.jspvà cố gắng truy cập nó. Nó sẽ hiển thị kết quả sau:

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Bây giờ chạy http: // localhost: 8080 / main.jsp một lần nữa và nó sẽ chỉ hiển thị một cookie như sau:

Found Cookies Name and Value

Name : last_name, Value: Player

Bạn có thể xóa cookie của mình trong Internet Explorer theo cách thủ công. Bắt đầu từ menu Công cụ và chọn Tùy chọn Internet. Để xóa tất cả cookie, hãy nhấp vào nút Xóa cookie.

Trong chương này, chúng ta sẽ thảo luận về theo dõi phiên trong JSP. HTTP là một giao thức "không trạng thái" có nghĩa là mỗi khi máy khách truy xuất một Trang web, máy khách sẽ mở một kết nối riêng đến máy chủ Web và máy chủ tự động không lưu giữ bất kỳ bản ghi nào về yêu cầu của máy khách trước đó.

Duy trì phiên giữa máy khách và máy chủ

Bây giờ chúng ta hãy thảo luận một số tùy chọn để duy trì phiên làm việc giữa Máy khách web và Máy chủ web -

Bánh quy

Máy chủ web có thể gán một ID phiên duy nhất làm cookie cho mỗi máy khách web và đối với các yêu cầu tiếp theo từ máy khách, chúng có thể được nhận dạng bằng cách sử dụng cookie đã nhận.

Đây có thể không phải là một cách hiệu quả vì trình duyệt đôi khi không hỗ trợ cookie. Nó không được khuyến khích sử dụng thủ tục này để duy trì các phiên.

Trường biểu mẫu ẩn

Máy chủ web có thể gửi trường biểu mẫu HTML ẩn cùng với ID phiên duy nhất như sau:

<input type = "hidden" name = "sessionid" value = "12345">

Mục nhập này có nghĩa là, khi biểu mẫu được gửi, tên và giá trị được chỉ định sẽ tự động được đưa vào GET hoặc là POSTdữ liệu. Mỗi khi trình duyệt web gửi lại yêu cầu,session_id giá trị có thể được sử dụng để theo dõi các trình duyệt web khác nhau.

Đây có thể là một cách hiệu quả để theo dõi phiên nhưng việc nhấp vào liên kết siêu văn bản thông thường (<A HREF...>) không dẫn đến việc gửi biểu mẫu, vì vậy các trường biểu mẫu ẩn cũng không thể hỗ trợ theo dõi phiên chung.

Viết lại URL

Bạn có thể thêm một số dữ liệu bổ sung vào cuối mỗi URL. Dữ liệu này xác định phiên; máy chủ có thể liên kết số nhận dạng phiên đó với dữ liệu mà nó đã lưu trữ về phiên đó.

Ví dụ, với http://tutorialspoint.com/file.htm;sessionid=12345, mã định danh phiên được đính kèm dưới dạng sessionid = 12345 có thể được truy cập tại máy chủ web để xác định máy khách.

Viết lại URL là một cách tốt hơn để duy trì các phiên và hoạt động cho các trình duyệt khi chúng không hỗ trợ cookie. Hạn chế ở đây là bạn sẽ phải tạo động mọi URL để chỉ định ID phiên mặc dù trang là một trang HTML tĩnh đơn giản.

Đối tượng phiên

Ngoài các tùy chọn đã đề cập ở trên, JSP sử dụng Giao diện HttpSession được cung cấp bởi servlet. Giao diện này cung cấp một cách để xác định một người dùng trên.

  • một yêu cầu một trang hoặc
  • truy cập vào một trang web hoặc
  • lưu trữ thông tin về người dùng đó

Theo mặc định, các JSP đã bật theo dõi phiên và một đối tượng HttpSession mới được khởi tạo tự động cho mỗi máy khách mới. Việc tắt theo dõi phiên yêu cầu phải tắt rõ ràng bằng cách đặt thuộc tính phiên chỉ thị trang thành false như sau:

<%@ page session = "false" %>

Công cụ JSP hiển thị đối tượng HttpSession với tác giả JSP thông qua sessionvật. Từsession đối tượng đã được cung cấp cho lập trình viên JSP, lập trình viên có thể ngay lập tức bắt đầu lưu trữ và truy xuất dữ liệu từ đối tượng mà không cần khởi tạo hoặc getSession().

Dưới đây là tóm tắt các phương pháp quan trọng có sẵn thông qua đối tượng phiên -

Không. Phương pháp & Mô tả
1

public Object getAttribute(String name)

Phương thức này trả về đối tượng được ràng buộc với tên được chỉ định trong phiên này hoặc null nếu không có đối tượng nào bị ràng buộc dưới tên.

2

public Enumeration getAttributeNames()

Phương thức này trả về một Danh sách các đối tượng Chuỗi chứa tên của tất cả các đối tượng được liên kết với phiên này.

3

public long getCreationTime()

Phương thức này trả về thời gian khi phiên này được tạo, được tính bằng mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT.

4

public String getId()

Phương thức này trả về một chuỗi chứa số nhận dạng duy nhất được chỉ định cho phiên này.

5

public long getLastAccessedTime()

Phương thức này trả về lần cuối cùng khách hàng gửi yêu cầu liên quan đến phiên này, dưới dạng số mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT.

6

public int getMaxInactiveInterval()

Phương thức này trả về khoảng thời gian tối đa, tính bằng giây, vùng chứa servlet sẽ giữ cho phiên này mở giữa các lần truy cập máy khách.

7

public void invalidate()

Phương thức này làm mất hiệu lực phiên này và hủy liên kết bất kỳ đối tượng nào bị ràng buộc với nó.

số 8

public boolean isNew()

Phương thức này trả về true nếu máy khách chưa biết về phiên hoặc nếu máy khách chọn không tham gia phiên.

9

public void removeAttribute(String name)

Phương thức này loại bỏ đối tượng bị ràng buộc với tên được chỉ định khỏi phiên này.

10

public void setAttribute(String name, Object value)

Phương thức này liên kết một đối tượng với phiên này, sử dụng tên được chỉ định.

11

public void setMaxInactiveInterval(int interval)

Phương thức này chỉ định thời gian, tính bằng giây, giữa các yêu cầu của khách hàng trước khi vùng chứa servlet sẽ làm mất hiệu lực phiên này.

Ví dụ về theo dõi phiên

Ví dụ này mô tả cách sử dụng đối tượng HttpSession để tìm ra thời gian tạo và thời gian được truy cập cuối cùng cho một phiên. Chúng tôi sẽ liên kết một phiên mới với yêu cầu nếu một phiên chưa tồn tại.

<%@ page import = "java.io.*,java.util.*" %>
<%
   // Get session creation time.
   Date createTime = new Date(session.getCreationTime());
   
   // Get last access time of this Webpage.
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "Welcome Back to my website";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // Check if this is new comer on your Webpage.
   if (session.isNew() ){
      title = "Welcome to my website";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } 
   visitCount = (Integer)session.getAttribute(visitCountKey);
   visitCount = visitCount + 1;
   userID = (String)session.getAttribute(userIDKey);
   session.setAttribute(visitCountKey,  visitCount);
%>

<html>
   <head>
      <title>Session Tracking</title>
   </head>
   
   <body>
      <center>
         <h1>Session Tracking</h1>
      </center>
      
      <table border = "1" align = "center"> 
         <tr bgcolor = "#949494">
            <th>Session info</th>
            <th>Value</th>
         </tr> 
         <tr>
            <td>id</td>
            <td><% out.print( session.getId()); %></td>
         </tr> 
         <tr>
            <td>Creation Time</td>
            <td><% out.print(createTime); %></td>
         </tr> 
         <tr>
            <td>Time of Last Access</td>
            <td><% out.print(lastAccessTime); %></td>
         </tr> 
         <tr>
            <td>User ID</td>
            <td><% out.print(userID); %></td>
         </tr> 
         <tr>
            <td>Number of visits</td>
            <td><% out.print(visitCount); %></td>
         </tr> 
      </table> 
   
   </body>
</html>

Bây giờ hãy đặt đoạn mã trên vào main.jsp và cố gắng truy cập http://localhost:8080/main.jsp. Sau khi chạy URL, bạn sẽ nhận được kết quả sau:

Chào mừng đến trang web của tôi

Session Information

Thông tin phiên giá trị
Tôi 0AE3EC93FF44E3C525B4351B77ABB2D5
Thời gian sáng tạo Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010
Thời gian truy cập cuối cùng Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010
Tên người dùng A B C D
Số lượt truy cập 0

Bây giờ hãy thử chạy cùng một JSP lần thứ hai, bạn sẽ nhận được kết quả như sau.

Chào mừng trở lại trang web của tôi

Session Information

loại thông tin giá trị
Tôi 0AE3EC93FF44E3C525B4351B77ABB2D5
Thời gian sáng tạo Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010
Thời gian truy cập cuối cùng Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010
Tên người dùng A B C D
Số lượt truy cập 1

Xóa dữ liệu phiên

Khi bạn hoàn thành với dữ liệu phiên của người dùng, bạn có một số tùy chọn -

  • Remove a particular attribute - Bạn có thể gọi public void removeAttribute(String name) để xóa giá trị được liên kết với một khóa cụ thể.

  • Delete the whole session - Bạn có thể gọi public void invalidate() để hủy toàn bộ phiên.

  • Setting Session timeout - Bạn có thể gọi public void setMaxInactiveInterval(int interval) phương pháp để đặt thời gian chờ cho một phiên riêng lẻ.

  • Log the user out - Các máy chủ hỗ trợ servlet 2.4, bạn có thể gọi logout để đăng xuất máy khách ra khỏi máy chủ Web và làm mất hiệu lực tất cả các phiên thuộc về tất cả người dùng.

  • web.xml Configuration - Nếu bạn đang sử dụng Tomcat, ngoài các phương pháp đã đề cập ở trên, bạn có thể cấu hình thời gian chờ phiên trong tệp web.xml như sau.

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

Thời gian chờ được biểu thị bằng phút và ghi đè thời gian chờ mặc định là 30 phút trong Tomcat.

Các getMaxInactiveInterval( )trong một servlet trả về khoảng thời gian chờ cho phiên đó tính bằng giây. Vì vậy, nếu phiên của bạn được định cấu hình trong web.xml trong 15 phút,getMaxInactiveInterval( ) trả về 900.

Trong chương này, chúng ta sẽ thảo luận về Tải lên tệp trong JSP. JSP có thể được sử dụng với thẻ biểu mẫu HTML để cho phép người dùng tải tệp lên máy chủ. Tệp được tải lên có thể là tệp văn bản hoặc tệp nhị phân hoặc tệp hình ảnh hoặc bất kỳ tài liệu nào.

Tạo biểu mẫu tải lên tệp

Bây giờ chúng ta hãy hiểu cách tạo biểu mẫu tải lên tệp. Mã HTML sau tạo một biểu mẫu người tải lên. Sau đây là những điểm quan trọng cần lưu ý:

  • Hình thức method thuộc tính phải được đặt thành POST không thể sử dụng phương thức và phương thức GET.

  • Hình thức enctype thuộc tính phải được đặt thành multipart/form-data.

  • Hình thức actionthuộc tính phải được đặt thành tệp JSP sẽ xử lý việc tải tệp lên tại máy chủ phụ trợ. Ví dụ sau đang sử dụnguploadFile.jsp tệp chương trình để tải tệp lên.

  • Để tải lên một tệp, bạn nên sử dụng một tệp <input .../> thẻ với thuộc tính type = "file". Để cho phép tải lên nhiều tệp, hãy bao gồm nhiều thẻ đầu vào với các giá trị khác nhau cho thuộc tính name. Trình duyệt liên kết nút Duyệt với mỗi nút trong số chúng.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "UploadServlet" method = "post"
         enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
   
</html>

Điều này sẽ hiển thị kết quả sau. Bây giờ bạn có thể chọn một tệp từ PC cục bộ và khi người dùng nhấp vào "Tải lên Tệp", biểu mẫu sẽ được gửi cùng với tệp đã chọn -

File Upload

Select a file to upload −



NOTE - Biểu mẫu trên chỉ là biểu mẫu giả và sẽ không hoạt động, bạn nên thử mã trên trên máy của bạn để làm cho nó hoạt động.

Viết tập lệnh JSP phụ trợ

Bây giờ chúng ta hãy xác định một vị trí nơi các tệp đã tải lên sẽ được lưu trữ. Bạn có thể viết mã này trong chương trình của mình hoặc tên thư mục này cũng có thể được thêm vào bằng cách sử dụng cấu hình bên ngoài, chẳng hạn nhưcontext-param phần tử trong web.xml như sau:

<web-app>
....
<context-param> 
   <description>Location to store uploaded file</description> 
   <param-name>file-upload</param-name> 
   <param-value>
      c:\apache-tomcat-5.5.29\webapps\data\
   </param-value> 
</context-param>
....
</web-app>

Sau đây là mã nguồn cho UploadFile.jsp. Điều này có thể xử lý việc tải lên nhiều tệp cùng một lúc. Bây giờ chúng ta hãy xem xét những điều sau đây trước khi tiếp tục tải tệp lên.

  • Ví dụ sau đây phụ thuộc vào FileUpload; đảm bảo rằng bạn có phiên bản mới nhất củacommons-fileupload.x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/fileupload/.

  • FileUpload phụ thuộc vào Commons IO; đảm bảo rằng bạn có phiên bản mới nhất củacommons-io-x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/io/.

  • Trong khi kiểm tra ví dụ sau, bạn nên tải lên tệp có kích thước nhỏ hơn maxFileSize nếu không tệp sẽ không được tải lên.

  • Đảm bảo rằng bạn đã tạo các thư mục c:\tempc:\apache-tomcat5.5.29\webapps\data tốt trước.

<%@ page import = "java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import = "javax.servlet.http.*" %>
<%@ page import = "org.apache.commons.fileupload.*" %>
<%@ page import = "org.apache.commons.fileupload.disk.*" %>
<%@ page import = "org.apache.commons.fileupload.servlet.*" %>
<%@ page import = "org.apache.commons.io.output.*" %>

<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   ServletContext context = pageContext.getServletContext();
   String filePath = context.getInitParameter("file-upload");

   // Verify the content type
   String contentType = request.getContentType();
   
   if ((contentType.indexOf("multipart/form-data") >= 0)) {
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );
      
      try { 
         // Parse the request to get file items.
         List fileItems = upload.parseRequest(request);

         // Process the uploaded file items
         Iterator i = fileItems.iterator();

         out.println("<html>");
         out.println("<head>");
         out.println("<title>JSP File upload</title>");  
         out.println("</head>");
         out.println("<body>");
         
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) {
               // Get the uploaded file parameters
               String fieldName = fi.getFieldName();
               String fileName = fi.getName();
               boolean isInMemory = fi.isInMemory();
               long sizeInBytes = fi.getSize();
            
               // Write the file
               if( fileName.lastIndexOf("\\") >= 0 ) {
                  file = new File( filePath + 
                  fileName.substring( fileName.lastIndexOf("\\"))) ;
               } else {
                  file = new File( filePath + 
                  fileName.substring(fileName.lastIndexOf("\\")+1)) ;
               }
               fi.write( file ) ;
               out.println("Uploaded Filename: " + filePath + 
               fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      } catch(Exception ex) {
         System.out.println(ex);
      }
   } else {
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>");
      out.println("</html>");
   }
%>

Bây giờ hãy thử tải tệp lên bằng biểu mẫu HTML mà bạn đã tạo ở trên. Khi bạn thửhttp://localhost:8080/UploadFile.htm, nó sẽ hiển thị kết quả sau. Điều này sẽ giúp bạn tải lên bất kỳ tệp nào từ máy cục bộ của bạn.

File Upload

Select a file to upload −


Nếu tập lệnh JSP của bạn hoạt động tốt, tệp của bạn sẽ được tải lên trong c:\apache-tomcat5.5.29\webapps\data\ danh mục.

Trong chương này, chúng ta sẽ thảo luận về cách xử lý dữ liệu trong JSP. Một trong những lợi thế quan trọng nhất của việc sử dụng JSP là bạn có thể sử dụng tất cả các phương thức có sẵn trong Java lõi. Chúng tôi sẽ đưa bạn quaDate lớp có sẵn trong java.utilgói hàng; lớp này đóng gói ngày và giờ hiện tại.

Lớp Date hỗ trợ hai hàm tạo. Phương thức khởi tạo đầu tiên khởi tạo đối tượng với ngày và giờ hiện tại.

Date( )

Hàm tạo sau chấp nhận một đối số bằng số mili giây đã trôi qua kể từ nửa đêm, ngày 1 tháng 1 năm 1970.

Date(long millisec)

Khi bạn có sẵn đối tượng Ngày, bạn có thể gọi bất kỳ phương thức hỗ trợ nào sau đây để chơi với ngày -

Không. Phương pháp & Mô tả
1

boolean after(Date date)

Trả về true nếu đối tượng Date đang gọi chứa ngày muộn hơn ngày được chỉ định bởi ngày tháng, nếu không, nó trả về false.

2

boolean before(Date date)

Trả về true nếu đối tượng Date đang gọi có chứa ngày sớm hơn ngày được chỉ định bởi ngày tháng, nếu không, nó trả về false.

3

Object clone( )

Nhân bản đối tượng Ngày đang gọi.

4

int compareTo(Date date)

So sánh giá trị của đối tượng đang gọi với giá trị của ngày tháng. Trả về 0 nếu các giá trị bằng nhau. Trả về giá trị âm nếu đối tượng gọi sớm hơn ngày. Trả về giá trị dương nếu đối tượng gọi muộn hơn ngày.

5

int compareTo(Object obj)

Hoạt động giống hệt nhau để so sánhTo (Ngày) nếu obj thuộc lớp Ngày. Nếu không, nó ném một ClassCastException.

6

boolean equals(Object date)

Trả về true nếu đối tượng Date đang gọi chứa cùng ngày và giờ với đối tượng được chỉ định theo ngày, ngược lại, nó trả về false.

7

long getTime( )

Trả về số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970.

số 8

int hashCode( )

Trả về mã băm cho đối tượng đang gọi.

9

void setTime(long time)

Đặt ngày và giờ như được chỉ định theo thời gian, biểu thị thời gian đã trôi qua tính bằng mili giây từ nửa đêm, ngày 1 tháng 1 năm 1970

10

String toString( )

Chuyển đổi đối tượng Date đang gọi thành một chuỗi và trả về kết quả.

Lấy ngày và giờ hiện tại

Với chương trình JSP, rất dễ dàng để có được ngày và giờ hiện tại. Bạn có thể sử dụng một đối tượng Ngày đơn giản vớitoString() để in ngày và giờ hiện tại như sau:

<%@ page import = "java.io.*,java.util.*, javax.servlet.*" %>

<html>
   <head>
      <title>Display Current Date & Time</title>
   </head>
   
   <body>
      <center>
         <h1>Display Current Date & Time</h1>
      </center>
      <%
         Date date = new Date();
         out.print( "<h2 align = \"center\">" +date.toString()+"</h2>");
      %>
   </body>
</html>

Bây giờ hãy để chúng tôi giữ mã trong CurrentDate.jsp và sau đó gọi JSP này bằng cách sử dụng URL http://localhost:8080/CurrentDate.jsp. Bạn sẽ nhận được kết quả sau:

Display Current Date & Time

Mon Jun 21 21:46:49 GMT+04:00 2010

Làm mới trang với URL http://localhost:8080/CurrentDate.jsp. Bạn sẽ thấy sự khác biệt trong vài giây mỗi khi bạn làm mới.

So sánh ngày

Như đã thảo luận trong các phần trước, bạn có thể sử dụng tất cả các phương thức Java có sẵn trong các tập lệnh JSP của mình. Trong trường hợp bạn cần so sánh hai ngày, hãy xem xét các phương pháp sau:

  • Bạn có thể dùng getTime( ) để có được số mili giây đã trôi qua kể từ nửa đêm, ngày 1 tháng 1 năm 1970, cho cả hai đối tượng và sau đó so sánh hai giá trị này.

  • Bạn có thể sử dụng các phương pháp before( ), after( )equals( )bởi vì ngày 12 của tháng đến trước ngày 18; ví dụ,new Date(99, 2, 12).before(new Date (99, 2, 18)) trả về true.

  • Bạn có thể dùng compareTo( )phương pháp; phương pháp này được định nghĩa bởiComparable interface và được thực hiện bởi Date.

Định dạng ngày bằng SimpleDateFormat

SimpleDateFormat là một lớp cụ thể để định dạng và phân tích cú pháp ngày tháng theo cách nhạy cảm với ngôn ngữ. SimpleDateFormat cho phép bạn bắt đầu bằng cách chọn bất kỳ mẫu nào do người dùng xác định để định dạng ngày-giờ.

Hãy để chúng tôi sửa đổi ví dụ trên như sau:

<%@ page import = "java.io.*,java.util.*" %>
<%@ page import = "javax.servlet.*,java.text.*" %>

<html>
   <head>
      <title>Display Current Date & Time</title>
   </head>
   
   <body>
      <center>
         <h1>Display Current Date & Time</h1>
      </center>
      <%
         Date dNow = new Date( );
         SimpleDateFormat ft = 
         new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
         out.print( "<h2 align=\"center\">" + ft.format(dNow) + "</h2>");
      %>
   </body>
</html>

Biên dịch servlet trên một lần nữa và sau đó gọi servlet này bằng cách sử dụng URL http://localhost:8080/CurrentDate. Bạn sẽ nhận được kết quả sau:

Display Current Date & Time

Mon 2010.06.21 at 10:06:44 PM GMT+04:00

Mã định dạng ngày tháng đơn giản

Để chỉ định định dạng thời gian, hãy sử dụng chuỗi mẫu thời gian. Trong mẫu này, tất cả các chữ cái ASCII được dành riêng dưới dạng chữ cái mẫu, được định nghĩa như sau:

Tính cách Sự miêu tả Thí dụ
G Người chỉ định kỷ nguyên QUẢNG CÁO
y Năm có bốn chữ số 2001
M Tháng trong năm Tháng bảy hoặc 07
d Ngày trong tháng 0
h Giờ tính theo SA / CH (1 ~ 12) 2
H Giờ trong ngày (0 ~ 23) 22
m Phút sau giờ 30
S Giây sau phút 55
S Mili giây 234
E Ngày trong tuần Thứ ba
D Ngày trong năm 360
F Ngày trong tuần trong tháng 2 (thứ tư thứ hai trong tháng bảy)
w Tuần trong năm 40
W Tuần trong tháng
a Điểm đánh dấu AM / PM BUỔI CHIỀU
k Giờ trong ngày (1 ~ 24) 24
K Giờ SAU / CH (0 ~ 11) 0
z Múi giờ giờ chuẩn phương Đông
' Thoát cho văn bản Dấu phân cách
" Trích dẫn duy nhất `

Để có danh sách đầy đủ các phương thức có sẵn không đổi để thao tác ngày tháng, bạn có thể tham khảo tài liệu Java tiêu chuẩn.

Trong chương này, chúng ta sẽ thảo luận về chuyển hướng trang với JSP. Chuyển hướng trang thường được sử dụng khi tài liệu di chuyển đến một vị trí mới và chúng tôi cần đưa khách hàng đến vị trí mới này. Điều này có thể là do cân bằng tải hoặc do ngẫu nhiên hóa đơn giản.

Cách đơn giản nhất để chuyển hướng một yêu cầu đến một trang khác là sử dụng sendRedirect()phương thức của đối tượng phản hồi. Sau đây là chữ ký của phương pháp này:

public void response.sendRedirect(String location)
throws IOException

Phương pháp này sẽ gửi lại phản hồi cho trình duyệt cùng với mã trạng thái và vị trí trang mới. Bạn cũng có thể sử dụngsetStatus()setHeader() các phương pháp cùng nhau để đạt được cùng một ví dụ chuyển hướng -

....
String site = "http://www.newpage.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site); 
....

Thí dụ

Ví dụ này cho thấy cách một JSP thực hiện chuyển hướng trang đến một vị trí khác -

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>Page Redirection</title>
   </head>
   
   <body>
      <center>
         <h1>Page Redirection</h1>
      </center>
      <%
         // New location to be redirected
         String site = new String("http://www.photofuntoos.com");
         response.setStatus(response.SC_MOVED_TEMPORARILY);
         response.setHeader("Location", site); 
      %>
   </body>
</html>

Bây giờ chúng ta hãy đặt mã trên vào PageRedirect.jsp và gọi JSP này bằng cách sử dụng URL http://localhost:8080/PageRedirect.jsp. Điều này sẽ đưa bạn đến URL đã chohttp://www.photofuntoos.com.

Trong chương này, chúng ta sẽ thảo luận về Bộ đếm lượt truy cập trong JSP. Bộ đếm lượt truy cập cho bạn biết về số lượt truy cập trên một trang cụ thể trên trang web của bạn. Thông thường, bạn đính kèm bộ đếm lượt truy cập với trang index.jsp của mình, giả sử mọi người truy cập lần đầu tiên trên trang chủ của bạn.

Để triển khai bộ đếm lần truy cập, bạn có thể sử dụng đối tượng Ngầm ứng dụng và các phương thức liên quan getAttribute()setAttribute().

Đối tượng này là một đại diện của trang JSP thông qua toàn bộ vòng đời của nó. Đối tượng này được tạo khi trang JSP được khởi tạo và sẽ bị xóa khi trang JSP bị xóa bởijspDestroy() phương pháp.

Sau đây là cú pháp để đặt một biến ở cấp ứng dụng:

application.setAttribute(String Key, Object Value);

Bạn có thể sử dụng phương pháp trên để đặt một biến bộ đếm lần truy cập và đặt lại cùng một biến. Sau đây là phương thức để đọc biến được đặt bởi phương thức trước:

application.getAttribute(String Key);

Mỗi khi người dùng truy cập trang của bạn, bạn có thể đọc giá trị hiện tại của bộ đếm lượt truy cập và tăng nó lên một và đặt lại nó để sử dụng trong tương lai.

Thí dụ

Ví dụ này cho thấy cách bạn có thể sử dụng JSP để đếm tổng số lần truy cập trên một trang cụ thể. Nếu bạn muốn đếm tổng số lượt truy cập vào trang web của mình thì bạn sẽ phải đưa cùng một mã vào tất cả các trang JSP.

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>Application object in JSP</title>
   </head>
   
   <body>
      <%
         Integer hitsCount = (Integer)application.getAttribute("hitCounter");
         if( hitsCount ==null || hitsCount == 0 ) {
            /* First visit */
            out.println("Welcome to my website!");
            hitsCount = 1;
         } else {
            /* return visit */
            out.println("Welcome back to my website!");
            hitsCount += 1;
         }
         application.setAttribute("hitCounter", hitsCount);
      %>
      <center>
         <p>Total number of visits: <%= hitsCount%></p>
      </center>
   
   </body>
</html>

Bây giờ chúng ta hãy đặt đoạn mã trên vào main.jsp và gọi JSP này bằng cách sử dụng URL http://localhost:8080/main.jsp. Điều này sẽ hiển thị giá trị bộ đếm lần truy cập tăng lên khi bạn làm mới trang. Bạn có thể thử truy cập trang bằng các trình duyệt khác nhau và bạn sẽ thấy rằng bộ đếm lượt truy cập sẽ tiếp tục tăng theo mỗi lượt truy cập và bạn sẽ nhận được kết quả như sau:

Welcome back to my website!

Total number of visits: 12

Lượt đặt lại bộ đếm

Điều gì xảy ra khi bạn khởi động lại ứng dụng của mình, tức là máy chủ web, điều này sẽ đặt lại biến ứng dụng của bạn và bộ đếm của bạn sẽ đặt lại về 0. Để tránh mất mát này, hãy xem xét các điểm sau:

  • Xác định một bảng cơ sở dữ liệu với một số lượng duy nhất, giả sử chúng tôi nói rằng số lượng cao. Gán giá trị 0 cho nó.

  • Với mỗi lần truy cập, hãy đọc bảng để nhận giá trị của hitcount.

  • Tăng giá trị của hitcount lên một và cập nhật bảng với giá trị mới.

  • Hiển thị giá trị mới của hitcount dưới dạng tổng số lần truy cập trang.

  • Nếu bạn muốn tính số lần truy cập cho tất cả các trang, hãy triển khai logic trên cho tất cả các trang.

Trong chương này, chúng ta sẽ thảo luận về Tự động làm mới trong JSP. Hãy xem xét một trang web đang hiển thị điểm trò chơi trực tiếp hoặc trạng thái thị trường chứng khoán hoặc tỷ lệ trao đổi tiền tệ. Đối với tất cả các loại trang như vậy, bạn cần phải làm mới Trang web của mình thường xuyên bằng cách sử dụng nút làm mới hoặc tải lại bằng trình duyệt của mình.

JSP giúp công việc này trở nên dễ dàng bằng cách cung cấp cho bạn một cơ chế mà bạn có thể tạo một trang web theo cách mà nó sẽ tự động làm mới sau một khoảng thời gian nhất định.

Cách đơn giản nhất để làm mới một Trang web là sử dụng setIntHeader()phương thức của đối tượng phản hồi. Sau đây là chữ ký của phương pháp này:

public void setIntHeader(String header, int headerValue)

Phương thức này gửi lại tiêu đề "Làm mới" cho trình duyệt cùng với một giá trị số nguyên cho biết khoảng thời gian tính bằng giây.

Ví dụ về làm mới trang tự động

Trong ví dụ sau, chúng tôi sẽ sử dụng setIntHeader() phương pháp để thiết lập Refreshđầu trang. Điều này sẽ giúp mô phỏng đồng hồ kỹ thuật số -

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>Auto Refresh Header Example</title>
   </head>
   
   <body>
      <center>
         <h2>Auto Refresh Header Example</h2>
         <%
            // Set refresh, autoload time as 5 seconds
            response.setIntHeader("Refresh", 5);
            
            // Get current time
            Calendar calendar = new GregorianCalendar();
            String am_pm;
            
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);
            
            if(calendar.get(Calendar.AM_PM) == 0)
               am_pm = "AM";
            else
               am_pm = "PM";
            String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
            out.println("Crrent Time: " + CT + "\n");
         %>
      </center>
   
   </body>
</html>

Bây giờ hãy đặt đoạn mã trên vào main.jspvà cố gắng truy cập nó. Điều này sẽ hiển thị thời gian hệ thống hiện tại sau mỗi 5 giây như sau. Chỉ cần chạy JSP và chờ xem kết quả -

Auto Refresh Header Example

Current Time is: 9:44:50 PM

Trong chương này, chúng ta sẽ thảo luận về cách gửi email bằng JSP. Để gửi email bằng JSP, bạn phải cóJavaMail APIJava Activation Framework (JAF) được cài đặt trên máy của bạn.

  • Bạn có thể tải xuống phiên bản mới nhất của JavaMail (Phiên bản 1.2) từ trang web chuẩn của Java.

  • Bạn có thể tải xuống phiên bản mới nhất của JavaBeans Activation Framework JAF (Phiên bản 1.0.2) từ trang web chuẩn của Java.

Tải xuống và giải nén các tệp này, trong các thư mục cấp cao nhất mới được tạo. Bạn sẽ tìm thấy một số tệp jar cho cả hai ứng dụng. Bạn cần thêmmail.jaractivation.jar các tệp trong CLASSPATH của bạn.

Gửi một email đơn giản

Đây là một ví dụ để gửi một email đơn giản từ máy của bạn. Người ta cho rằnglocalhostđược kết nối với Internet và nó có đủ khả năng để gửi email. Đảm bảo tất cả các tệp jar từ gói API Email Java và gói JAF đều có sẵn trong CLASSPATH.

<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>

<%
   String result;
   
   // Recipient's email ID needs to be mentioned.
   String to = "[email protected]";

   // Sender's email ID needs to be mentioned
   String from = "[email protected]";

   // Assuming you are sending email from localhost
   String host = "localhost";

   // Get system properties object
   Properties properties = System.getProperties();

   // Setup mail server
   properties.setProperty("mail.smtp.host", host);

   // Get the default Session object.
   Session mailSession = Session.getDefaultInstance(properties);

   try {
      // Create a default MimeMessage object.
      MimeMessage message = new MimeMessage(mailSession);
      
      // Set From: header field of the header.
      message.setFrom(new InternetAddress(from));
      
      // Set To: header field of the header.
      message.addRecipient(Message.RecipientType.TO,
                               new InternetAddress(to));
      // Set Subject: header field
      message.setSubject("This is the Subject Line!");
      
      // Now set the actual message
      message.setText("This is actual message");
      
      // Send message
      Transport.send(message);
      result = "Sent message successfully....";
   } catch (MessagingException mex) {
      mex.printStackTrace();
      result = "Error: unable to send message....";
   }
%>

<html>
   <head>
      <title>Send Email using JSP</title>
   </head>
   
   <body>
      <center>
         <h1>Send Email using JSP</h1>
      </center>
      
      <p align = "center">
         <% 
            out.println("Result: " + result + "\n");
         %>
      </p>
   </body>
</html>

Bây giờ chúng ta hãy đặt đoạn mã trên vào SendEmail.jsp tệp và gọi JSP này bằng cách sử dụng URL http://localhost:8080/SendEmail.jsp. Điều này sẽ giúp gửi email đến ID email đã cho[email protected]. Bạn sẽ nhận được phản hồi sau:

Send Email using JSP

Result: Sent message successfully....

Nếu bạn muốn gửi email đến nhiều người nhận, hãy sử dụng các phương pháp sau để chỉ định nhiều ID email:

void addRecipients(Message.RecipientType type, Address[] addresses)
throws MessagingException

Đây là mô tả của các tham số -

  • type- Điều này sẽ được đặt thành TO, CC hoặc BCC. Ở đây CC đại diện cho Bản sao carbon và BCC đại diện cho Bản sao carbon đen. Ví dụ Message.RecipientType.TO

  • addresses- Đây là mảng ID email. Bạn sẽ cần sử dụng phương thức InternetAddress () khi chỉ định các ID email

Gửi Email HTML

Đây là một ví dụ để gửi một email HTML từ máy của bạn. Người ta cho rằnglocalhostđược kết nối với Internet và nó có đủ khả năng để gửi email. Đảm bảo tất cả các tệp jar từJava Email API packageJAF package có sẵn trong CLASSPATH.

Ví dụ này rất giống với ví dụ trước, ngoại trừ việc ở đây chúng tôi đang sử dụng setContent() phương pháp đặt nội dung có đối số thứ hai là "text/html" để xác định rằng nội dung HTML được bao gồm trong thư.

Sử dụng ví dụ này, bạn có thể gửi nội dung HTML lớn như bạn yêu cầu.

<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>

<%
   String result;
   
   // Recipient's email ID needs to be mentioned.
   String to = "[email protected]";

   // Sender's email ID needs to be mentioned
   String from = "[email protected]";

   // Assuming you are sending email from localhost
   String host = "localhost";

   // Get system properties object
   Properties properties = System.getProperties();

   // Setup mail server
   properties.setProperty("mail.smtp.host", host);

   // Get the default Session object.
   Session mailSession = Session.getDefaultInstance(properties);

   try {
      // Create a default MimeMessage object.
      MimeMessage message = new MimeMessage(mailSession);
      
      // Set From: header field of the header.
      message.setFrom(new InternetAddress(from));
      
      // Set To: header field of the header.
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
      
      // Set Subject: header field
      message.setSubject("This is the Subject Line!");
     
      // Send the actual HTML message, as big as you like
      message.setContent("<h1>This is actual message</h1>", "text/html" );
      
      // Send message
      Transport.send(message);
      result = "Sent message successfully....";
   } catch (MessagingException mex) {
      mex.printStackTrace();
      result = "Error: unable to send message....";
   }
%>

<html>
   <head>
      <title>Send HTML Email using JSP</title>
   </head>

   <body>
      <center>
         <h1>Send Email using JSP</h1>
      </center>
      
      <p align = "center">
         <% 
            out.println("Result: " + result + "\n");
         %>
      </p>
   </body>
</html>

Bây giờ chúng ta hãy sử dụng JSP ở trên để gửi tin nhắn HTML trên một ID email nhất định.

Gửi tệp đính kèm trong Email

Sau đây là một ví dụ để gửi một email có tệp đính kèm từ máy của bạn -

<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>

<%
   String result;
   
   // Recipient's email ID needs to be mentioned.
   String to = "[email protected]";

   // Sender's email ID needs to be mentioned
   String from = "[email protected]";

   // Assuming you are sending email from localhost
   String host = "localhost";

   // Get system properties object
   Properties properties = System.getProperties();

   // Setup mail server
   properties.setProperty("mail.smtp.host", host);

   // Get the default Session object.
   Session mailSession = Session.getDefaultInstance(properties);

   try {
      // Create a default MimeMessage object.
      MimeMessage message = new MimeMessage(mailSession);

      // Set From: header field of the header.
      message.setFrom(new InternetAddress(from));

      // Set To: header field of the header.
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

      // Set Subject: header field
      message.setSubject("This is the Subject Line!");

      // Create the message part 
      BodyPart messageBodyPart = new MimeBodyPart();

      // Fill the message
      messageBodyPart.setText("This is message body");
      
      // Create a multipart message
      Multipart multipart = new MimeMultipart();

      // Set text message part
      multipart.addBodyPart(messageBodyPart);

      // Part two is attachment
      messageBodyPart = new MimeBodyPart();
      
      String filename = "file.txt";
      DataSource source = new FileDataSource(filename);
      messageBodyPart.setDataHandler(new DataHandler(source));
      messageBodyPart.setFileName(filename);
      multipart.addBodyPart(messageBodyPart);

      // Send the complete message parts
      message.setContent(multipart );

      // Send message
      Transport.send(message);
      String title = "Send Email";
      result = "Sent message successfully....";
   } catch (MessagingException mex) {
      mex.printStackTrace();
      result = "Error: unable to send message....";
   }
%>

<html>
   <head>
      <title>Send Attachment Email using JSP</title>
   </head>
   
   <body>
      <center>
         <h1>Send Attachment Email using JSP</h1>
      </center>
      
      <p align = "center">
         <%out.println("Result: " + result + "\n");%>
      </p>
   </body>
</html>

Bây giờ chúng ta hãy chạy JSP ở trên để gửi một tệp dưới dạng tệp đính kèm cùng với một thông báo trên một ID email nhất định.

Phần xác thực người dùng

Nếu bắt buộc phải cung cấp ID người dùng và Mật khẩu cho máy chủ email để xác thực, thì bạn có thể đặt các thuộc tính này như sau:

props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");

Phần còn lại của cơ chế gửi email sẽ vẫn như được giải thích ở trên.

Sử dụng biểu mẫu để gửi email

Bạn có thể sử dụng biểu mẫu HTML để chấp nhận các tham số email và sau đó bạn có thể sử dụng request đối tượng để lấy tất cả thông tin như sau:

String to = request.getParameter("to");
String from = request.getParameter("from");
String subject = request.getParameter("subject");
String messageText = request.getParameter("body");

Sau khi bạn có tất cả thông tin, bạn có thể sử dụng các chương trình nêu trên để gửi email.

Trong chương này, chúng ta sẽ hiểu các thẻ khác nhau trong JSP. Thư viện thẻ chuẩn của các trang JavaServer (JSTL) là một tập hợp các thẻ JSP hữu ích đóng gói chức năng cốt lõi phổ biến cho nhiều ứng dụng JSP.

JSTL có hỗ trợ cho các tác vụ cấu trúc, phổ biến như lặp lại và điều kiện, thẻ để thao tác tài liệu XML, thẻ quốc tế hóa và thẻ SQL. Nó cũng cung cấp một khuôn khổ để tích hợp các thẻ tùy chỉnh hiện có với các thẻ JSTL.

Cài đặt Thư viện JSTL

Để bắt đầu làm việc với thẻ JSP, trước tiên bạn cần cài đặt thư viện JSTL. Nếu bạn đang sử dụng vùng chứa Apache Tomcat, hãy làm theo hai bước sau:

Step 1- Tải xuống bản phân phối nhị phân từ Apache Standard Taglib và giải nén tệp nén.

Step 2 - Để sử dụng Taglib Chuẩn từ Jakarta Taglibs distribution, chỉ cần sao chép các tệp JAR trong thư mục 'lib' của bản phân phối vào ứng dụng của bạn webapps\ROOT\WEB-INF\lib danh mục.

Để sử dụng bất kỳ thư viện nào, bạn phải bao gồm chỉ thị <taglib> ở đầu mỗi JSP sử dụng thư viện.

Phân loại các thẻ JSTL

Các thẻ JSTL có thể được phân loại, theo chức năng của chúng, thành các nhóm thư viện thẻ JSTL sau đây có thể được sử dụng khi tạo một trang JSP:

  • Core Tags

  • Formatting tags

  • SQL tags

  • XML tags

  • JSTL Functions

Thẻ cốt lõi

Nhóm thẻ cốt lõi là các thẻ JSTL được sử dụng phổ biến nhất. Sau đây là cú pháp để đưa thư viện JSTL Core vào JSP của bạn:

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

Bảng sau liệt kê các Thẻ JSTL cốt lõi:

Không. Thẻ & Mô tả
1

Giống như <% = ...>, nhưng đối với biểu thức.

2

Đặt kết quả của một đánh giá biểu thức trong một 'scope'

3

Loại bỏ một scoped variable (từ một phạm vi cụ thể, nếu được chỉ định).

4

Bắt bất kỳ Throwable xảy ra trong cơ thể của nó và tùy ý để lộ ra ngoài.

5

Thẻ điều kiện đơn giản đánh giá nội dung của nó nếu điều kiện được cung cấp là đúng.

6

Thẻ điều kiện đơn giản thiết lập ngữ cảnh cho các hoạt động có điều kiện loại trừ lẫn nhau, được đánh dấu bằng <when><otherwise>.

7

Thẻ phụ của <choose> bao gồm cơ thể của nó nếu tình trạng của nó đánh giá 'true'.

số 8

Thẻ phụ của <choose> theo sau <when> và chỉ chạy nếu tất cả các điều kiện trước đó được đánh giá là 'false'.

9

Truy xuất một URL tuyệt đối hoặc tương đối và hiển thị nội dung của nó cho cả trang, một Chuỗi trong 'var'hoặc một Người đọc trong 'varReader'.

10

Thẻ lặp lại cơ bản, chấp nhận nhiều loại tập hợp khác nhau và hỗ trợ đặt con và chức năng khác.

11

Lặp đi lặp lại các mã thông báo, được phân tách bằng các bộ mê cung cấp.

12

Thêm một tham số vào một chứa 'import' URL của thẻ.

13

Chuyển hướng đến một URL mới.

14

Tạo một URL với các tham số truy vấn tùy chọn

Định dạng thẻ

Các thẻ định dạng JSTL được sử dụng để định dạng và hiển thị văn bản, ngày, giờ và số cho các Trang web được quốc tế hóa. Sau đây là cú pháp để bao gồm thư viện Định dạng trong JSP của bạn:

<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>

Bảng sau liệt kê các Định dạng Thẻ JSTL -

Không. Thẻ & Mô tả
1

Để hiển thị giá trị số với độ chính xác hoặc định dạng cụ thể.

2

Phân tích cú pháp biểu diễn chuỗi của một số, đơn vị tiền tệ hoặc tỷ lệ phần trăm.

3

Định dạng ngày và / hoặc giờ bằng các kiểu và mẫu được cung cấp.

4

Phân tích cú pháp biểu diễn chuỗi của ngày và / hoặc giờ

5

Tải gói tài nguyên sẽ được nội dung thẻ của nó sử dụng.

6

Lưu trữ ngôn ngữ đã cho trong biến cấu hình ngôn ngữ.

7

Tải gói tài nguyên và lưu trữ trong biến phạm vi được đặt tên hoặc biến cấu hình gói.

số 8

Chỉ định múi giờ cho mọi hành động định dạng hoặc phân tích cú pháp thời gian được lồng trong nội dung của nó.

9

Lưu trữ múi giờ đã cho trong biến cấu hình múi giờ

10

Hiển thị một tin nhắn được quốc tế hóa.

11

Đặt mã hóa ký tự yêu cầu

Thẻ SQL

Thư viện thẻ JSTL SQL cung cấp các thẻ để tương tác với cơ sở dữ liệu quan hệ (RDBMS) như Oracle, mySQL, hoặc là Microsoft SQL Server.

Sau đây là cú pháp để bao gồm thư viện JSTL SQL trong JSP của bạn:

<%@ taglib prefix = "sql" uri = "http://java.sun.com/jsp/jstl/sql" %>

Bảng sau liệt kê các Thẻ JSTL của SQL:

Không. Thẻ & Mô tả
1

Tạo một Nguồn dữ liệu đơn giản chỉ phù hợp để tạo mẫu

2

Thực thi truy vấn SQL được xác định trong phần thân của nó hoặc thông qua thuộc tính sql.

3

Thực thi cập nhật SQL được xác định trong phần thân của nó hoặc thông qua thuộc tính sql.

4

Đặt một tham số trong câu lệnh SQL thành giá trị được chỉ định.

5

Đặt một tham số trong câu lệnh SQL thành giá trị java.util.Date được chỉ định.

6

Cung cấp các phần tử hành động cơ sở dữ liệu lồng nhau với một Kết nối được chia sẻ, được thiết lập để thực thi tất cả các câu lệnh như một giao dịch.

Thẻ XML

Các thẻ XML JSTL cung cấp một cách tập trung vào JSP để tạo và thao tác các tài liệu XML. Sau đây là cú pháp để đưa thư viện JSTL XML vào JSP của bạn.

Thư viện thẻ XML JSTL có các thẻ tùy chỉnh để tương tác với dữ liệu XML. Điều này bao gồm phân tích cú pháp XML, chuyển đổi dữ liệu XML và điều khiển luồng dựa trên các biểu thức XPath.

<%@ taglib prefix = "x" 
   uri = "http://java.sun.com/jsp/jstl/xml" %>

Trước khi tiếp tục với các ví dụ, bạn sẽ cần sao chép hai thư viện liên quan đến XML và XPath sau vào <Tomcat Installation Directory>\lib -

  • XercesImpl.jar - Tải xuống từ https://www.apache.org/dist/xerces/j/

  • xalan.jar - Tải xuống từ https://xml.apache.org/xalan-j/index.html

Sau đây là danh sách các Thẻ JSTL của XML:

Không. Thẻ & Mô tả
1

Giống như <% = ...>, nhưng đối với biểu thức XPath.

2

Được sử dụng để phân tích cú pháp dữ liệu XML được chỉ định thông qua một thuộc tính hoặc trong phần thân thẻ.

3

Đặt một biến thành giá trị của biểu thức XPath.

4

Đánh giá một biểu thức XPath thử nghiệm và nếu nó đúng, nó sẽ xử lý phần thân của nó. Nếu điều kiện thử nghiệm là sai, cơ thể sẽ bị bỏ qua.

5

Để lặp qua các nút trong tài liệu XML.

6

Thẻ điều kiện đơn giản thiết lập ngữ cảnh cho các hoạt động có điều kiện loại trừ lẫn nhau, được đánh dấu bằng <when><otherwise> các thẻ.

7

Thẻ phụ của <choose> bao gồm nội dung của nó nếu biểu thức của nó đánh giá là 'true'.

số 8

Thẻ phụ của <choose> theo sau <when> và chỉ chạy nếu tất cả các điều kiện trước đó được đánh giá là 'false'.

9

Áp dụng biến đổi XSL trên tài liệu XML

10

Được sử dụng cùng với transform để đặt một tham số trong biểu định kiểu XSLT

Hàm JSTL

JSTL bao gồm một số hàm tiêu chuẩn, hầu hết trong số đó là các hàm thao tác chuỗi phổ biến. Sau đây là cú pháp để bao gồm thư viện Hàm JSTL trong JSP của bạn:

<%@ taglib prefix = "fn" 
   uri = "http://java.sun.com/jsp/jstl/functions" %>

Bảng sau liệt kê các Hàm JSTL khác nhau:

Không. Mô tả chức năng
1 fn: chứa ()

Kiểm tra xem một chuỗi đầu vào có chứa chuỗi con được chỉ định hay không.

2 fn: containsIgnoreCase ()

Kiểm tra xem một chuỗi đầu vào có chứa chuỗi con được chỉ định không theo cách phân biệt chữ hoa chữ thường.

3 fn: endWith ()

Kiểm tra xem một chuỗi đầu vào có kết thúc bằng hậu tố được chỉ định hay không.

4 fn: EscapeXml ()

Thoát các ký tự có thể được hiểu là đánh dấu XML.

5 fn: indexOf ()

Trả về chỉ mục chứa một chuỗi lần xuất hiện đầu tiên của một chuỗi con được chỉ định.

6 fn: tham gia ()

Nối tất cả các phần tử của một mảng thành một chuỗi.

7 fn: chiều dài ()

Trả về số mục trong một tập hợp hoặc số ký tự trong một chuỗi.

số 8 fn: thay thế ()

Trả về một chuỗi do thay thế trong một chuỗi đầu vào tất cả các lần xuất hiện bằng một chuỗi đã cho.

9 fn: split ()

Tách một chuỗi thành một mảng các chuỗi con.

10 fn: startedWith ()

Kiểm tra xem một chuỗi đầu vào có bắt đầu bằng tiền tố được chỉ định hay không.

11 fn: chuỗi con ()

Trả về một tập hợp con của một chuỗi.

12 fn: substringAfter ()

Trả về một tập hợp con của một chuỗi theo sau một chuỗi con cụ thể.

13 fn: substringBefore ()

Trả về một tập hợp con của một chuỗi trước một chuỗi con cụ thể.

14 fn: toLowerCase ()

Chuyển đổi tất cả các ký tự của một chuỗi thành chữ thường.

15 fn: toUpperCase ()

Chuyển đổi tất cả các ký tự của một chuỗi thành chữ hoa.

16 fn: trim ()

Loại bỏ khoảng trắng từ cả hai đầu của một chuỗi.

Trong chương này, chúng ta sẽ thảo luận về cách truy cập cơ sở dữ liệu với JSP. Chúng tôi cho rằng bạn đã hiểu rõ về cách hoạt động của ứng dụng JDBC. Trước khi bắt đầu với truy cập cơ sở dữ liệu thông qua JSP, hãy đảm bảo rằng bạn đã thiết lập môi trường JDBC phù hợp cùng với cơ sở dữ liệu.

Để biết thêm chi tiết về cách truy cập cơ sở dữ liệu bằng JDBC và thiết lập môi trường của nó, bạn có thể xem qua Hướng dẫn JDBC của chúng tôi .

Để bắt đầu với khái niệm cơ bản, chúng ta hãy tạo một bảng và tạo một vài bản ghi trong bảng đó như sau:

Tạo bảng

Để tạo Employees trong cơ sở dữ liệu EMP, sử dụng các bước sau:

Bước 1

Mở một Command Prompt và thay đổi thư mục cài đặt như sau:

C:\>
C:\>cd Program Files\MySQL\bin
C:\Program Files\MySQL\bin>

Bước 2

Đăng nhập vào cơ sở dữ liệu như sau:

C:\Program Files\MySQL\bin>mysql -u root -p
Enter password: ********
mysql>

Bước 3

Tạo Employee bàn trong TEST cơ sở dữ liệu như sau - -

mysql> use TEST;
mysql> create table Employees
   (
      id int not null,
      age int not null,
      first varchar (255),
      last varchar (255)
   );
Query OK, 0 rows affected (0.08 sec)
mysql>

Tạo bản ghi dữ liệu

Bây giờ chúng ta hãy tạo một vài bản ghi trong Employee bảng như sau - -

mysql> INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali');
Query OK, 1 row affected (0.05 sec)
 
mysql> INSERT INTO Employees VALUES (101, 25, 'Mahnaz', 'Fatma');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal');
Query OK, 1 row affected (0.00 sec)
 
mysql>

CHỌN hoạt động

Ví dụ sau cho thấy cách chúng ta có thể thực thi SQL SELECT câu lệnh sử dụng JTSL trong lập trình JSP -

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>SELECT Operation</title>
   </head>

   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root"  password = "pass123"/>
 
      <sql:query dataSource = "${snapshot}" var = "result">
         SELECT * from Employees;
      </sql:query>
 
      <table border = "1" width = "100%">
         <tr>
            <th>Emp ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Age</th>
         </tr>
         
         <c:forEach var = "row" items = "${result.rows}"> <tr> <td><c:out value = "${row.id}"/></td>
               <td><c:out value = "${row.first}"/></td> <td><c:out value = "${row.last}"/></td>
               <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Truy cập JSP ở trên, kết quả sau sẽ được hiển thị:

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Khan 30
103 Sumit Mittal 28

INSERT hoạt động

Ví dụ sau cho thấy cách chúng ta có thể thực thi câu lệnh SQL INSERT sử dụng JTSL trong lập trình JSP:

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>JINSERT Operation</title>
   </head>
   
   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root"  password = "pass123"/>
         <sql:update dataSource = "${snapshot}" var = "result">
         INSERT INTO Employees VALUES (104, 2, 'Nuha', 'Ali');
      </sql:update>
 
      <sql:query dataSource = "${snapshot}" var = "result"> SELECT * from Employees; </sql:query> <table border = "1" width = "100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>Age</th> </tr> <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td> <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td> <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Truy cập JSP ở trên, kết quả sau sẽ được hiển thị:

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Khan 30
103 Sumit Mittal 28
104 Nuha Ali 2

Thao tác DELETE

Ví dụ sau cho thấy cách chúng ta có thể thực thi SQL DELETE câu lệnh sử dụng JTSL trong lập trình JSP -

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>DELETE Operation</title>
   </head>
   
   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root" password = "pass123"/>
 
      <c:set var = "empId" value = "103"/>
 
      <sql:update dataSource = "${snapshot}" var = "count"> DELETE FROM Employees WHERE Id = ? <sql:param value = "${empId}" />
      </sql:update>
 
      <sql:query dataSource = "${snapshot}" var = "result"> SELECT * from Employees; </sql:query> <table border = "1" width = "100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>Age</th> </tr> <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td> <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td> <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Truy cập JSP ở trên, kết quả sau sẽ được hiển thị:

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Khan 30

CẬP NHẬT Hoạt động

Ví dụ sau cho thấy cách chúng ta có thể thực thi SQL UPDATE câu lệnh sử dụng JTSL trong lập trình JSP -

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>DELETE Operation</title>
   </head>
   
   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root" password = "pass123"/>
 
      <c:set var = "empId" value = "102"/>
 
      <sql:update dataSource = "${snapshot}" var = "count"> UPDATE Employees SET WHERE last = 'Ali' <sql:param value = "${empId}" />
      </sql:update>
 
      <sql:query dataSource = "${snapshot}" var = "result"> SELECT * from Employees; </sql:query> <table border = "1" width = "100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>Age</th> </tr> <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td> <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td> <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Truy cập JSP ở trên, kết quả sau sẽ được hiển thị:

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Ali 30

Khi bạn gửi dữ liệu XML qua HTTP, bạn nên sử dụng JSP để xử lý các tài liệu XML đến và đi; ví dụ, tài liệu RSS. Vì một tài liệu XML chỉ đơn thuần là một loạt văn bản, nên việc tạo một tài liệu thông qua JSP dễ dàng hơn nhiều so với việc tạo một tài liệu HTML.

Gửi XML từ JSP

Bạn có thể gửi nội dung XML bằng cách sử dụng JSP giống như cách bạn gửi HTML. Sự khác biệt duy nhất là bạn phải đặt loại nội dung của trang của bạn thành văn bản / xml. Để đặt loại nội dung, hãy sử dụng<%@page%> thẻ, như thế này -

<%@ page contentType = "text/xml" %>

Ví dụ sau sẽ cho thấy cách gửi nội dung XML đến trình duyệt:

<%@ page contentType = "text/xml" %>

<books>
   <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
   </book>
</books>

Truy cập XML ở trên bằng các trình duyệt khác nhau để xem bản trình bày cây tài liệu của XML ở trên.

Xử lý XML trong JSP

Trước khi tiến hành xử lý XML bằng JSP, bạn sẽ cần sao chép hai thư viện liên quan đến XML và XPath sau đây vào <Tomcat Installation Directory>\lib -

  • XercesImpl.jar - Tải xuống từ https://www.apache.org/dist/xerces/j/

  • xalan.jar - Tải xuống từ https://xml.apache.org/xalan-j/index.html

Hãy để chúng tôi đưa nội dung sau vào tệp books.xml -

<books>
   <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
   </book>
   
   <book>
      <name>Great Mistry</name>
      <author>NUHA</author>
      <price>2000</price>
   </book>
</books>

Hãy thử những điều sau đây main.jsp, giữ trong cùng một thư mục -

<%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "x" uri="http://java.sun.com/jsp/jstl/xml" %>
 
<html>
   <head>
      <title>JSTL x:parse Tags</title>
   </head>

   <body>
      <h3>Books Info:</h3>
      <c:import var = "bookInfo" url="http://localhost:8080/books.xml"/>
 
      <x:parse xml = "${bookInfo}" var = "output"/> <b>The title of the first book is</b>: <x:out select = "$output/books/book[1]/name" />
      <br>
      
      <b>The price of the second book</b>: 
      <x:out select = "$output/books/book[2]/price" />
   </body>
</html>

Truy cập JSP ở trên bằng cách sử dụng http://localhost:8080/main.jsp, kết quả sau sẽ được hiển thị:

Books Info:

The title of the first book is:Padam History The price of the second book: 2000

Định dạng XML với JSP

Hãy xem xét biểu định kiểu XSLT sau style.xsl -

<?xml version = "1.0"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
   version = "1.0">
 
   <xsl:output method = "html" indent = "yes"/>
   <xsl:template match = "/">
      <html>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>
    
   <xsl:template match = "books">
      <table border = "1" width = "100%">
         <xsl:for-each select = "book">
            <tr>
               <td>
                  <i><xsl:value-of select = "name"/></i>
               </td>
               
               <td>
                  <xsl:value-of select = "author"/>
               </td>
               
               <td>
                  <xsl:value-of select = "price"/>
               </td>
            </tr>
         </xsl:for-each>
      </table>
   
   </xsl:template>
</xsl:stylesheet>

Bây giờ hãy xem xét tệp JSP sau:

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "x" uri = "http://java.sun.com/jsp/jstl/xml" %>
 
<html>
   <head>
      <title>JSTL x:transform Tags</title>
   </head>
   
   <body>
      <h3>Books Info:</h3>
      <c:set var = "xmltext">
         <books>
            <book>
               <name>Padam History</name>
               <author>ZARA</author>
               <price>100</price>
            </book>
            
            <book>
               <name>Great Mistry</name>
               <author>NUHA</author>
               <price>2000</price>
            </book>
         </books>
      </c:set>
 
      <c:import url = "http://localhost:8080/style.xsl" var = "xslt"/>
      <x:transform xml = "${xmltext}" xslt = "${xslt}"/>
   </body>
</html>

Kết quả sau sẽ được hiển thị:

Books Info:

Padam History ZARA 100
Great Mistry NUHA 2000

Để biết thêm về xử lý XML bằng JSTL, bạn có thể kiểm tra Thư viện thẻ chuẩn JSP .

JavaBean là một lớp Java được xây dựng đặc biệt được viết bằng Java và được mã hóa theo các đặc tả API của JavaBeans.

Sau đây là các đặc điểm duy nhất phân biệt một JavaBean với các lớp Java khác:

  • Nó cung cấp một phương thức khởi tạo không đối số, mặc định.

  • Nó phải có thể tuần tự hóa và có thể triển khai Serializable giao diện.

  • Nó có thể có một số thuộc tính có thể đọc hoặc viết.

  • Nó có thể có một số "getter"và"setter"cho các thuộc tính.

Thuộc tính JavaBeans

Thuộc tính JavaBean là một thuộc tính được đặt tên có thể được truy cập bởi người dùng đối tượng. Thuộc tính có thể thuộc bất kỳ kiểu dữ liệu Java nào, bao gồm các lớp mà bạn xác định.

Thuộc tính JavaBean có thể là read, write, read only, hoặc là write only. Các thuộc tính JavaBean được truy cập thông qua hai phương thức trong lớp triển khai của JavaBean -

Không. Phương pháp & Mô tả
1

đượcPropertyName()

Ví dụ: nếu tên thuộc tính là firstName , tên phương thức của bạn sẽ làgetFirstName()để đọc thuộc tính đó. Phương thức này được gọi là accessor.

2

bộPropertyName()

Ví dụ: nếu tên thuộc tính là firstName , tên phương thức của bạn sẽ làsetFirstName()để viết thuộc tính đó. Phương pháp này được gọi là mutator.

Thuộc tính chỉ đọc sẽ chỉ có một getPropertyName() và một thuộc tính chỉ ghi sẽ chỉ có một setPropertyName() phương pháp.

Ví dụ về JavaBeans

Hãy xem xét một lớp học sinh có ít thuộc tính -

package com.tutorialspoint;

public class StudentsBean implements java.io.Serializable {
   private String firstName = null;
   private String lastName = null;
   private int age = 0;

   public StudentsBean() {
   }
   public String getFirstName(){
      return firstName;
   }
   public String getLastName(){
      return lastName;
   }
   public int getAge(){
      return age;
   }
   public void setFirstName(String firstName){
      this.firstName = firstName;
   }
   public void setLastName(String lastName){
      this.lastName = lastName;
   }
   public void setAge(Integer age){
      this.age = age;
   }
}

Truy cập JavaBeans

Các useBeanhành động khai báo một JavaBean để sử dụng trong một JSP. Sau khi được khai báo, bean trở thành một biến kịch bản có thể được truy cập bởi cả phần tử kịch bản và các thẻ tùy chỉnh khác được sử dụng trong JSP. Cú pháp đầy đủ cho thẻ useBean như sau:

<jsp:useBean id = "bean's name" scope = "bean's scope" typeSpec/>

Ở đây các giá trị cho thuộc tính phạm vi có thể là page, request, session hoặc là application basedtheo yêu cầu của bạn. Giá trị củaid thuộc tính có thể là bất kỳ giá trị nào miễn là nó là một tên duy nhất trong số các useBean declarations trong cùng một JSP.

Ví dụ sau cho thấy cách sử dụng hành động useBean:

<html>
   <head>
      <title>useBean Example</title>
   </head>
   
   <body>
      <jsp:useBean id = "date" class = "java.util.Date" /> 
      <p>The date/time is <%= date %>
   </body>
</html>

Bạn sẽ nhận được kết quả sau - -

The date/time is Thu Sep 30 11:18:11 GST 2010

Truy cập thuộc tính JavaBeans

Cùng với <jsp:useBean...> hành động, bạn có thể sử dụng <jsp:getProperty/> hành động để truy cập các phương thức get và <jsp:setProperty/>hành động để truy cập các phương thức đã thiết lập. Đây là cú pháp đầy đủ -

<jsp:useBean id = "id" class = "bean's class" scope = "bean's scope">
   <jsp:setProperty name = "bean's id" property = "property name"  
      value = "value"/>
   <jsp:getProperty name = "bean's id" property = "property name"/>
   ...........
</jsp:useBean>

Thuộc tính name tham chiếu đến id của JavaBean đã được đưa vào JSP trước đó bởi hành động useBean. Thuộc tính property là tên củaget hoặc là set phương thức cần được gọi.

Ví dụ sau cho thấy cách truy cập dữ liệu bằng cú pháp trên:

<html>
   <head>
      <title>get and set properties Example</title>
   </head>
   
   <body>
      <jsp:useBean id = "students" class = "com.tutorialspoint.StudentsBean"> 
         <jsp:setProperty name = "students" property = "firstName" value = "Zara"/>
         <jsp:setProperty name = "students" property = "lastName" value = "Ali"/>
         <jsp:setProperty name = "students" property = "age" value = "10"/>
      </jsp:useBean>

      <p>Student First Name: 
         <jsp:getProperty name = "students" property = "firstName"/>
      </p>
      
      <p>Student Last Name: 
         <jsp:getProperty name = "students" property = "lastName"/>
      </p>
      
      <p>Student Age: 
         <jsp:getProperty name = "students" property = "age"/>
      </p>

   </body>
</html>

Hãy để chúng tôi làm StudentsBean.classcó sẵn trong CLASSPATH. Truy cập JSP ở trên. kết quả sau sẽ được hiển thị:

Student First Name: Zara 

Student Last Name: Ali 

Student Age: 10

Trong chương này, chúng ta sẽ thảo luận về Thẻ tùy chỉnh trong JSP. Thẻ tùy chỉnh là một phần tử ngôn ngữ JSP do người dùng xác định. Khi một trang JSP chứa thẻ tùy chỉnh được dịch sang một servlet, thẻ sẽ được chuyển đổi thành các hoạt động trên một đối tượng được gọi là trình xử lý thẻ. Vùng chứa Web sau đó sẽ gọi các hoạt động đó khi servlet của trang JSP được thực thi.

Phần mở rộng thẻ JSP cho phép bạn tạo các thẻ mới mà bạn có thể chèn trực tiếp vào Trang JavaServer. Đặc tả JSP 2.0 đã giới thiệu Trình xử lý thẻ đơn giản để viết các thẻ tùy chỉnh này.

Để viết thẻ tùy chỉnh, bạn chỉ cần mở rộng SimpleTagSupport lớp và ghi đè lên doTag() , nơi bạn có thể đặt mã của mình để tạo nội dung cho thẻ.

Tạo thẻ "Xin chào"

Hãy xem xét bạn muốn xác định một thẻ tùy chỉnh có tên <ex: Hello> và bạn muốn sử dụng nó theo cách sau mà không có phần thân -

<ex:Hello />

Để tạo một thẻ JSP tùy chỉnh, trước tiên bạn phải tạo một lớp Java hoạt động như một trình xử lý thẻ. Bây giờ hãy để chúng tôi tạoHelloTag lớp như sau -

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   public void doTag() throws JspException, IOException {
      JspWriter out = getJspContext().getOut();
      out.println("Hello Custom Tag!");
   }
}

Đoạn mã trên có mã hóa đơn giản trong đó doTag() phương thức lấy đối tượng JspContext hiện tại bằng cách sử dụng getJspContext() và sử dụng nó để gửi "Hello Custom Tag!" đến hiện tại JspWriter vật

Hãy để chúng tôi biên dịch lớp trên và sao chép nó trong một thư mục có sẵn trong biến môi trường CLASSPATH. Cuối cùng, tạo tệp thư viện thẻ sau:<Tomcat-Installation-Directory>webapps\ROOT\WEB-INF\custom.tld.

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD</short-name>
   
   <tag>
      <name>Hello</name>
      <tag-class>com.tutorialspoint.HelloTag</tag-class>
      <body-content>empty</body-content>
   </tag>
</taglib>

Bây giờ chúng ta hãy sử dụng thẻ tùy chỉnh đã xác định ở trên Hello trong chương trình JSP của chúng tôi như sau:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello/>
   </body>
</html>

Gọi JSP ở trên và điều này sẽ tạo ra kết quả sau:

Hello Custom Tag!

Truy cập Nội dung thẻ

Bạn có thể đưa thông báo vào nội dung thẻ như bạn đã thấy với các thẻ tiêu chuẩn. Hãy xem xét bạn muốn xác định một thẻ tùy chỉnh có tên<ex:Hello> và bạn muốn sử dụng nó theo cách sau đây với cơ thể -

<ex:Hello>
   This is message body
</ex:Hello>

Hãy để chúng tôi thực hiện các thay đổi sau trong mã thẻ ở trên để xử lý nội dung của thẻ -

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()
   
   throws JspException, IOException {
      getJspBody().invoke(sw);
      getJspContext().getOut().println(sw.toString());
   }
}

Tại đây, kết quả đầu ra từ lệnh gọi đầu tiên được ghi lại thành StringWritertrước khi được ghi vào JspWriter được liên kết với thẻ. Chúng tôi cần thay đổi tệp TLD như sau:

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>
   
   <tag>
      <name>Hello</name>
      <tag-class>com.tutorialspoint.HelloTag</tag-class>
      <body-content>scriptless</body-content>
   </tag>
</taglib>

Bây giờ chúng ta hãy gọi thẻ ở trên với nội dung thích hợp như sau:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello>
         This is message body
      </ex:Hello>
   </body>
</html>

Bạn sẽ nhận được kết quả sau:

This is message body

Thuộc tính thẻ tùy chỉnh

Bạn có thể sử dụng các thuộc tính khác nhau cùng với các thẻ tùy chỉnh của mình. Để chấp nhận một giá trị thuộc tính, một lớp thẻ tùy chỉnh cần triển khaisetter các phương thức, giống với các phương thức của JavaBean setter như hình dưới đây -

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   private String message;

   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()
   
   throws JspException, IOException {
      if (message != null) {
         /* Use message from attribute */
         JspWriter out = getJspContext().getOut();
         out.println( message );
      } else {
         /* use message from the body */
         getJspBody().invoke(sw);
         getJspContext().getOut().println(sw.toString());
      }
   }
}

Tên của thuộc tính là "message", vì vậy phương pháp setter là setMessage(). Bây giờ chúng ta hãy thêm thuộc tính này vào tệp TLD bằng cách sử dụng<attribute> phần tử như sau -

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>
   
   <tag>
      <name>Hello</name>
      <tag-class>com.tutorialspoint.HelloTag</tag-class>
      <body-content>scriptless</body-content>
      
      <attribute>
         <name>message</name>
      </attribute>
   
   </tag>
</taglib>

Chúng ta hãy theo dõi JSP với thuộc tính message như sau:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello message = "This is custom tag" />
   </body>
</html>

Điều này sẽ tạo ra kết quả sau:

This is custom tag

Xem xét việc bao gồm các thuộc tính sau cho một thuộc tính:

Không. Tài sản & Mục đích
1

name

Phần tử tên xác định tên của một thuộc tính. Mỗi tên thuộc tính phải là duy nhất cho một thẻ cụ thể.

2

required

Điều này chỉ định nếu thuộc tính này là bắt buộc hay là một tùy chọn. Nó sẽ là sai đối với tùy chọn.

3

rtexprvalue

Khai báo nếu giá trị biểu thức thời gian chạy cho thuộc tính thẻ là hợp lệ

4

type

Xác định kiểu lớp Java của thuộc tính này. Theo mặc định, nó được giả định làString

5

description

Mô tả thông tin có thể được cung cấp.

6

fragment

Khai báo nếu giá trị thuộc tính này được coi là JspFragment.

Dưới đây là ví dụ để chỉ định các thuộc tính liên quan đến một thuộc tính:

.....
   <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
   </attribute>
.....

Nếu bạn đang sử dụng hai thuộc tính, thì bạn có thể sửa đổi TLD của mình như sau:

.....
   <attribute>
      <name>attribute_name1</name>
      <required>false</required>
      <type>java.util.Boolean</type>
      <fragment>false</fragment>
   </attribute>
   
   <attribute>
      <name>attribute_name2</name>
      <required>true</required>
      <type>java.util.Date</type>
   </attribute>
.....

JSP Expression Language (EL) giúp bạn có thể dễ dàng truy cập dữ liệu ứng dụng được lưu trữ trong các thành phần JavaBeans. JSP EL cho phép bạn tạo biểu thức cả hai(a) số học và (b)hợp lý. Trong biểu thức JSP EL, bạn có thể sử dụngintegers, floating point numbers, strings, the built-in constants true and false cho các giá trị boolean và null.

Cú pháp đơn giản

Thông thường, khi bạn chỉ định một giá trị thuộc tính trong thẻ JSP, bạn chỉ cần sử dụng một chuỗi. Ví dụ -

<jsp:setProperty name = "box" property = "perimeter" value = "100"/>

JSP EL cho phép bạn chỉ định một biểu thức cho bất kỳ giá trị thuộc tính nào trong số này. Một cú pháp đơn giản cho JSP EL như sau:

${expr}

Đây exprchỉ định chính biểu thức. Các toán tử phổ biến nhất trong JSP EL là.[]. Hai toán tử này cho phép bạn truy cập các thuộc tính khác nhau của Java Beans và các đối tượng JSP tích hợp sẵn.

Ví dụ, cú pháp trên <jsp:setProperty> thẻ có thể được viết với một biểu thức như -

<jsp:setProperty name = "box" property = "perimeter" 
   value = "${2*box.width+2*box.height}"/>

Khi trình biên dịch JSP thấy ${} trong một thuộc tính, nó tạo ra mã để đánh giá biểu thức và thay thế giá trị của expresson.

Bạn cũng có thể sử dụng các biểu thức JSP EL trong văn bản mẫu cho thẻ. Ví dụ,<jsp:text>chỉ cần chèn nội dung của nó trong phần thân của một JSP. Sau<jsp:text> bảng kê khai <h1>Hello JSP!</h1> vào đầu ra JSP -

<jsp:text>
   <h1>Hello JSP!</h1>
</jsp:text>

Bây giờ bạn có thể bao gồm một biểu thức JSP EL trong phần nội dung của một <jsp:text> thẻ (hoặc bất kỳ thẻ nào khác) với cùng một ${}cú pháp bạn sử dụng cho các thuộc tính. Ví dụ -

<jsp:text>
   Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

Biểu thức EL có thể sử dụng dấu ngoặc đơn để nhóm các biểu thức con. Ví dụ,${(1 + 2) * 3} equals 9, but ${1 + (2 * 3)} equals 7.

Để hủy kích hoạt đánh giá các biểu thức EL, chúng tôi chỉ định isELIgnored thuộc tính của chỉ thị trang như bên dưới -

<%@ page isELIgnored = "true|false" %>

Các giá trị hợp lệ của thuộc tính này là true và false. Nếu đúng, biểu thức EL sẽ bị bỏ qua khi chúng xuất hiện trong văn bản tĩnh hoặc thuộc tính thẻ. Nếu nó là false, biểu thức EL được đánh giá bởi vùng chứa.

Các toán tử cơ bản trong EL

JSP Expression Language (EL) hỗ trợ hầu hết các toán tử số học và logic được hỗ trợ bởi Java. Bảng sau liệt kê các toán tử được sử dụng thường xuyên nhất:

Không. Nhà điều hành & Mô tả
1

.

Truy cập thuộc tính bean hoặc mục nhập Bản đồ

2

[]

Truy cập một mảng hoặc phần tử Danh sách

3

( )

Nhóm một biểu thức con để thay đổi thứ tự đánh giá

4

+

Thêm vào

5

-

Phép trừ hoặc phủ định một giá trị

6

*

Phép nhân

7

/ or div

Sư đoàn

số 8

% or mod

Modulo (phần còn lại)

9

== or eq

Kiểm tra sự bình đẳng

10

!= or ne

Kiểm tra sự bất bình đẳng

11

< or lt

Kiểm tra ít hơn

12

> or gt

Kiểm tra lớn hơn

13

<= or le

Kiểm tra nhỏ hơn hoặc bằng

14

>= or ge

Kiểm tra lớn hơn hoặc bằng

15

&& or and

Kiểm tra AND logic

16

|| or or

Kiểm tra logic HOẶC

17

! or not

Phần bổ sung Boolean một bậc

18

empty

Kiểm tra các giá trị biến trống

Các hàm trong JSP EL

JSP EL cho phép bạn sử dụng các hàm trong biểu thức. Các chức năng này phải được xác định trong các thư viện thẻ tùy chỉnh. Cách sử dụng hàm có cú pháp sau:

${ns:func(param1, param2, ...)}

Ở đâu ns là không gian tên của hàm, func là tên của hàm và param1là giá trị tham số đầu tiên. Ví dụ, hàmfn:length, là một phần của thư viện JSTL. Hàm này có thể được sử dụng như sau để lấy độ dài của một chuỗi.

${fn:length("Get my length")}

Để sử dụng một chức năng từ bất kỳ thư viện thẻ nào (tiêu chuẩn hoặc tùy chỉnh), bạn phải cài đặt thư viện đó trên máy chủ của mình và phải đưa thư viện vào JSP của bạn bằng cách sử dụng <taglib> chỉ thị như được giải thích trong chương JSTL.

Đối tượng ngầm định của JSP EL

Ngôn ngữ biểu thức JSP hỗ trợ các đối tượng ngầm định sau:

S.Không Đối tượng & Mô tả ngầm định
1

pageScope

Các biến có phạm vi từ phạm vi trang

2

requestScope

Các biến có phạm vi từ phạm vi yêu cầu

3

sessionScope

Các biến có phạm vi từ phạm vi phiên

4

applicationScope

Các biến có phạm vi từ phạm vi ứng dụng

5

param

Yêu cầu tham số dưới dạng chuỗi

6

paramValues

Yêu cầu tham số dưới dạng tập hợp các chuỗi

7

header

Tiêu đề yêu cầu HTTP dưới dạng chuỗi

số 8

headerValues

Tiêu đề yêu cầu HTTP dưới dạng tập hợp các chuỗi

9

initParam

Tham số khởi tạo ngữ cảnh

10

cookie

Giá trị cookie

11

pageContext

Đối tượng JSP PageContext cho trang hiện tại

Bạn có thể sử dụng các đối tượng này trong một biểu thức như thể chúng là các biến. Các ví dụ sau sẽ giúp bạn hiểu các khái niệm -

Đối tượng pageContext

Đối tượng pageContext cung cấp cho bạn quyền truy cập vào đối tượng JSP pageContext. Thông qua đối tượng pageContext, bạn có thể truy cập đối tượng yêu cầu. Ví dụ: để truy cập chuỗi truy vấn đến cho một yêu cầu, bạn có thể sử dụng biểu thức sau:

${pageContext.request.queryString}

Các đối tượng phạm vi

Các pageScope, requestScope, sessionScopeapplicationScope các biến cung cấp quyền truy cập vào các biến được lưu trữ ở mỗi cấp phạm vi.

Ví dụ: nếu bạn cần truy cập rõ ràng vào biến hộp trong phạm vi ứng dụng, bạn có thể truy cập nó thông qua biến applicationScope như applicationScope.box.

Đối tượng param và paramValues

Các đối tượng param và paramValues ​​cung cấp cho bạn quyền truy cập vào các giá trị tham số thường có sẵn thông qua request.getParameterrequest.getParameterValues các phương pháp.

Ví dụ: để truy cập một tham số có tên thứ tự, hãy sử dụng biểu thức ${param.order} hoặc là ${param["order"]}.

Sau đây là ví dụ để truy cập một tham số yêu cầu có tên tên người dùng -

<%@ page import = "java.io.*,java.util.*" %>
<%String title = "Accessing Request Param";%>

<html>
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>${param["username"]}</p>
      </div>
   </body>
</html>

Đối tượng param trả về các giá trị chuỗi đơn, trong khi đối tượng paramValues ​​trả về mảng chuỗi.

header và header Đối tượng

Các đối tượng header và headerValues ​​cung cấp cho bạn quyền truy cập vào các giá trị tiêu đề thường có sẵn thông qua request.getHeaderrequest.getHeaders các phương pháp.

Ví dụ: để truy cập tiêu đề có tên tác nhân người dùng, hãy sử dụng biểu thức ${header.user-agent} hoặc là ${header["user-agent"]}.

Dưới đây là ví dụ để truy cập một tham số tiêu đề có tên là user-agent -

<%@ page import = "java.io.*,java.util.*" %>
<%String title = "User Agent Example";%>

<html>
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>${header["user-agent"]}</p>
      </div>
   </body>
</html>

Đầu ra sẽ giống như sau:

User Agent Example

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)

Đối tượng tiêu đề trả về giá trị chuỗi đơn, trong khi đối tượng headerValues ​​trả về mảng chuỗi.

Trong chương này. chúng ta sẽ thảo luận về cách xử lý các ngoại lệ trong JSP. Khi bạn đang viết mã JSP, bạn có thể mắc lỗi mã hóa có thể xảy ra ở bất kỳ phần nào của mã. Có thể xảy ra các loại lỗi sau trong mã JSP của bạn:

Đã kiểm tra ngoại lệ

Một ngoại lệ đã kiểm tra là một ngoại lệ thường là lỗi của người dùng hoặc một vấn đề mà người lập trình không thể lường trước được. Ví dụ, nếu một tệp được mở, nhưng không thể tìm thấy tệp, thì một ngoại lệ sẽ xảy ra. Những ngoại lệ này không thể đơn giản bị bỏ qua tại thời điểm biên dịch.

Ngoại lệ thời gian chạy

Ngoại lệ thời gian chạy là một ngoại lệ mà lập trình viên có thể tránh được. Trái ngược với các ngoại lệ đã kiểm tra, các ngoại lệ thời gian chạy bị bỏ qua tại thời điểm khen ngợi.

Lỗi

Đây không phải là ngoại lệ, mà là những vấn đề phát sinh ngoài tầm kiểm soát của người dùng hoặc người lập trình. Các lỗi thường bị bỏ qua trong mã của bạn vì bạn hiếm khi có thể làm gì với lỗi. Ví dụ, nếu xảy ra tràn ngăn xếp, lỗi sẽ phát sinh. Chúng cũng được bỏ qua tại thời điểm biên dịch.

Chúng tôi sẽ thảo luận thêm về các cách để xử lý lỗi / ngoại lệ thời gian chạy xảy ra trong mã JSP của bạn.

Sử dụng Đối tượng Ngoại lệ

Đối tượng ngoại lệ là một thể hiện của một lớp con của Throwable (ví dụ: java.lang. NullPointerException) và chỉ có sẵn trong các trang lỗi. Bảng sau liệt kê các phương thức quan trọng có sẵn trong lớp Throwable.

Không. Phương pháp & Mô tả
1

public String getMessage()

Trả về một thông báo chi tiết về ngoại lệ đã xảy ra. Thông báo này được khởi tạo trong phương thức khởi tạo Throwable.

2

public Throwable getCause()

Trả về nguyên nhân của ngoại lệ như được đại diện bởi một đối tượng Có thể ném.

3

public String toString()

Trả về tên của lớp được nối với kết quả của getMessage().

4

public void printStackTrace()

In kết quả của toString() cùng với dấu vết ngăn xếp để System.err, luồng đầu ra lỗi.

5

public StackTraceElement [] getStackTrace()

Trả về một mảng chứa mỗi phần tử trên dấu vết ngăn xếp. Phần tử ở chỉ số 0 đại diện cho phần trên cùng của ngăn xếp cuộc gọi và phần tử cuối cùng trong mảng đại diện cho phương thức ở cuối ngăn xếp cuộc gọi.

6

public Throwable fillInStackTrace()

Làm đầy dấu vết ngăn xếp của đối tượng Có thể ném này bằng dấu vết ngăn xếp hiện tại, thêm vào bất kỳ thông tin nào trước đó trong dấu vết ngăn xếp.

JSP cung cấp cho bạn một tùy chọn để chỉ định Error Pagecho mỗi JSP. Bất cứ khi nào trang ném ra một ngoại lệ, vùng chứa JSP sẽ tự động gọi trang lỗi.

Sau đây là một ví dụ để xác định một trang lỗi cho một main.jsp. Để thiết lập trang lỗi, hãy sử dụng<%@ page errorPage = "xxx" %> chỉ thị.

<%@ page errorPage = "ShowError.jsp" %>

<html>
   <head>
      <title>Error Handling Example</title>
   </head>
   
   <body>
      <%
         // Throw an exception to invoke the error page
         int x = 1;
         
         if (x == 1) {
            throw new RuntimeException("Error condition!!!");
         }
      %>
   </body>
</html>

Bây giờ chúng ta sẽ viết một Xử lý lỗi JSP ShowError.jsp, được đưa ra bên dưới. Lưu ý rằng trang xử lý lỗi bao gồm lệnh<%@ page isErrorPage = "true" %>. Chỉ thị này khiến trình biên dịch JSP tạo ra biến cá thể ngoại lệ.

<%@ page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <p>Sorry, an error occurred.</p>
      <p>Here is the exception stack trace: </p>
      <pre><% exception.printStackTrace(response.getWriter()); %></pre>
   </body>
</html>

Truy cập main.jsp, bạn sẽ nhận được một đầu ra giống như sau:

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

Sử dụng thẻ JSTL cho trang lỗi

Bạn có thể sử dụng các thẻ JSTL để viết một trang lỗi ShowError.jsp. Trang này có logic gần giống như trong ví dụ trên, với cấu trúc tốt hơn và nhiều thông tin hơn -

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <table width = "100%" border = "1">
         <tr valign = "top">
            <td width = "40%"><b>Error:</b></td>
            <td>${pageContext.exception}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>URI:</b></td>
            <td>${pageContext.errorData.requestURI}</td> </tr> <tr valign = "top"> <td><b>Status code:</b></td> <td>${pageContext.errorData.statusCode}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Stack trace:</b></td>
            <td>
               <c:forEach var = "trace" 
                  items = "${pageContext.exception.stackTrace}"> <p>${trace}</p>
               </c:forEach>
            </td>
         </tr>
      </table>

   </body>
</html>

Truy cập main.jsp, phần sau sẽ được tạo:

Opps...

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Sử dụng Try ... Catch Block

Nếu bạn muốn xử lý các lỗi trong cùng một trang và muốn thực hiện một số hành động thay vì kích hoạt một trang lỗi, bạn có thể sử dụng try....catch khối.

Sau đây là một ví dụ đơn giản cho thấy cách sử dụng khối try ... catch. Hãy để chúng tôi đặt đoạn mã sau vào main.jsp -

<html>
   <head>
      <title>Try...Catch Example</title>
   </head>
   
   <body>
      <%
         try {
            int i = 1;
            i = i / 0;
            out.println("The answer is " + i);
         }
         catch (Exception e) {
            out.println("An exception occurred: " + e.getMessage());
         }
      %>
   </body>
</html>

Truy cập vào main.jsp, nó sẽ tạo ra một đầu ra giống như sau:

An exception occurred: / by zero

Trong chương này, chúng ta sẽ thảo luận về Gỡ lỗi một JSP. Việc kiểm tra / gỡ lỗi JSP và các servlet luôn khó khăn. JSP và Servlet có xu hướng liên quan đến một lượng lớn tương tác giữa máy khách / máy chủ, khiến cho các lỗi có thể xảy ra nhưng khó tái tạo.

Sau đây là một số gợi ý và gợi ý có thể giúp bạn gỡ lỗi.

Sử dụng System.out.println ()

System.out.println()dễ sử dụng như một điểm đánh dấu để kiểm tra xem một đoạn mã nhất định có đang được thực thi hay không. Chúng tôi cũng có thể in ra các giá trị biến. Hãy xem xét các điểm bổ sung sau:

  • Vì đối tượng Hệ thống là một phần của các đối tượng Java cốt lõi, nó có thể được sử dụng ở mọi nơi mà không cần cài đặt thêm bất kỳ lớp bổ sung nào. Điêu nay bao gômServlets, JSP, RMI, EJB's, ordinary Beansclassesstandalone applications.

  • So với việc dừng lại ở các điểm ngắt, viết thư cho System.out không can thiệp nhiều vào quy trình thực thi bình thường của ứng dụng, điều này làm cho nó rất có giá trị khi iming là quan trọng.

Sau đây là cú pháp để sử dụng System.out.println() -

System.out.println("Debugging message");

Ví dụ sau đây cho thấy cách sử dụng System.out.print() -

<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

<html>
   <head><title>System.out.println</title></head>
   <body>
      <c:forEach var = "counter" begin = "1" end = "10" step = "1" >
      
         <c:out value = "${counter-5}"/></br>
         <% System.out.println( "counter = " + pageContext.findAttribute("counter") ); %>
      </c:forEach>
      
   </body>
</html>

Truy cập vào JSP trên, trình duyệt sẽ hiển thị kết quả sau:

-4
-3
-2
-1
0
1
2
3
4
5

Nếu bạn đang sử dụng Tomcat, bạn cũng sẽ thấy những dòng này được nối vào cuối stdout.log trong thư mục nhật ký.

counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
counter = 6
counter = 7
counter = 8
counter = 9
counter = 10

Bằng cách này, bạn có thể đưa các biến và thông tin khác vào nhật ký hệ thống, chúng có thể được phân tích để tìm ra nguyên nhân gốc rễ của vấn đề hoặc vì nhiều lý do khác.

Sử dụng Trình ghi nhật ký JDB

Các J2SEkhung ghi nhật ký được thiết kế để cung cấp dịch vụ ghi nhật ký cho bất kỳ lớp nào đang chạy trong JVM. Chúng tôi có thể sử dụng khuôn khổ này để ghi lại bất kỳ thông tin nào.

Hãy để chúng tôi viết lại ví dụ trên bằng API trình ghi nhật ký JDK -

<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page import = "java.util.logging.Logger" %>

<html>
   <head><title>Logger.info</title></head>
   
   <body>
      <% Logger logger = Logger.getLogger(this.getClass().getName());%>

      <c:forEach var = "counter" begin = "1" end = "10" step = "1" >
      <c:set var = "myCount" value = "${counter-5}" />
      <c:out value = "${myCount}"/></br>
         <% String message = "counter = "
            + pageContext.findAttribute("counter") + "myCount = "
            + pageContext.findAttribute("myCount");
            logger.info( message );
         %>
      </c:forEach>
      
   </body>
</html>

Đoạn mã trên sẽ tạo ra kết quả tương tự trên trình duyệt và trong stdout.log, nhưng bạn sẽ có thêm thông tin trong stdout.log. Chúng tôi sẽ sử dụnginfophương pháp của trình ghi nhật ký vì và ghi lại thông báo chỉ cho mục đích thông tin. Sau đây là ảnh chụp nhanh của tệp stdout.log -

24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 1 myCount = -4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 2 myCount = -3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 3 myCount = -2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 4 myCount = -1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 5 myCount = 0
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 6 myCount = 1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 7 myCount = 2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 8 myCount = 3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 9 myCount = 4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 10 myCount = 5

Tin nhắn có thể được gửi ở nhiều cấp độ khác nhau bằng cách sử dụng các chức năng tiện lợi severe(), warning(), info(), config(), fine(), finer(),finest(). Ở đây, phương thức finest () có thể được sử dụng để ghi lại thông tin tốt nhất và phương thức nghiêm túc () có thể được sử dụng để ghi lại thông tin nghiêm trọng.

Bạn có thể sử dụng Log4J Framework để ghi nhật ký thông báo trong các tệp khác nhau dựa trên mức độ nghiêm trọng và tầm quan trọng của chúng.

Công cụ gỡ lỗi

NetBeans là Môi trường phát triển tích hợp Java mã nguồn mở và miễn phí hỗ trợ phát triển các ứng dụng Java và ứng dụng Web độc lập hỗ trợ các thông số kỹ thuật JSP và servlet cũng như bao gồm trình gỡ lỗi JSP.

NetBeans hỗ trợ các chức năng gỡ lỗi cơ bản sau:

  • Breakpoints
  • Bước qua mã
  • Watchpoints

Bạn có thể tham khảo NetBeans documentation để hiểu các chức năng gỡ lỗi ở trên.

Sử dụng JDB Debugger

Bạn có thể gỡ lỗi JSP và các servlet với cùng một jdb các lệnh bạn sử dụng để gỡ lỗi một applet hoặc một ứng dụng.

Để gỡ lỗi JSP hoặc servlet, bạn có thể gỡ lỗi sun.servlet.http.HttpServer, sau đó quan sát khi HttpServer thực thi JSP / servlet để phản hồi các yêu cầu HTTP mà chúng tôi thực hiện từ trình duyệt. Điều này rất giống với cách gỡ lỗi các applet. Sự khác biệt là với các applet, chương trình thực tế đang được gỡ lỗi làsun.applet.AppletViewer.

Hầu hết các trình gỡ lỗi đều ẩn chi tiết này bằng cách tự động biết cách gỡ lỗi các applet. Cho đến khi chúng làm tương tự với JSP, bạn phải trợ giúp trình gỡ lỗi của mình bằng cách xem xét những điều sau:

  • Đặt classpath của trình gỡ lỗi của bạn. Điều này giúp bạn tìm thấysun.servlet.http.Http-Server và các lớp liên quan.

  • Đặt classpath của trình gỡ lỗi của bạn. Điều này giúp bạn tìm thấy JSP và các lớp hỗ trợ, thường làROOT\WEB-INF\classes.

Khi bạn đã đặt classpath thích hợp, hãy bắt đầu gỡ lỗi sun.servlet.http.HttpServer. Bạn có thể đặt các điểm ngắt trong bất kỳ JSP nào mà bạn muốn gỡ lỗi, sau đó sử dụng trình duyệt web để đưa ra yêu cầu tới HttpServer cho JSP đã cho(http://localhost:8080/JSPToDebug). Việc thực thi ở đây dừng lại ở các điểm ngắt.

Sử dụng Nhận xét

Nhận xét trong mã của bạn có thể giúp quá trình gỡ lỗi theo nhiều cách khác nhau. Nhận xét có thể được sử dụng theo nhiều cách khác trong quá trình gỡ lỗi.

JSP sử dụng các nhận xét Java và single line (// ...)multiple line (/* ... */)nhận xét có thể được sử dụng để tạm thời xóa các phần trong mã Java của bạn. Nếu lỗi biến mất, hãy xem kỹ đoạn mã bạn vừa nhận xét và tìm ra vấn đề.

Tiêu đề Máy khách và Máy chủ

Đôi khi JSP không hoạt động như mong đợi, sẽ hữu ích khi xem xét yêu cầu và phản hồi HTTP thô. Nếu bạn đã quen với cấu trúc của HTTP, bạn có thể đọc yêu cầu và phản hồi và xem chính xác điều gì đang xảy ra với những tiêu đề đó.

Mẹo gỡ lỗi quan trọng

Dưới đây là danh sách một số mẹo gỡ lỗi khác về gỡ lỗi JSP -

  • Yêu cầu trình duyệt hiển thị nội dung thô của trang mà trình duyệt đang hiển thị. Điều này có thể giúp xác định các vấn đề về định dạng. Nó thường là một tùy chọn trong menu View.

  • Đảm bảo rằng trình duyệt không lưu vào bộ nhớ đệm đầu ra của yêu cầu trước đó bằng cách buộc tải lại toàn bộ trang. VớiNetscape Navigator, sử dụng Shift-Reload; vớiInternet Explorer sử dụng Shift-Refresh.

Các trang JavaServer và các servlet cung cấp một số cơ chế cho các nhà phát triển Web để bảo mật các ứng dụng. Các tài nguyên được bảo vệ một cách khai báo bằng cách xác định chúng trong bộ mô tả triển khai ứng dụng và gán một vai trò cho chúng.

Một số cấp độ xác thực có sẵn, từ xác thực cơ bản sử dụng số nhận dạng và mật khẩu đến xác thực tinh vi bằng chứng chỉ.

Xác thực dựa trên vai trò

Cơ chế xác thực trong đặc tả servlet sử dụng một kỹ thuật được gọi là role-based security. Ý tưởng là thay vì hạn chế tài nguyên ở cấp người dùng, bạn tạo vai trò và hạn chế tài nguyên theo vai trò.

Bạn có thể xác định các vai trò khác nhau trong tệp tomcat-users.xml, nằm ngoài thư mục chính của Tomcat trong conf. Ví dụ về tệp này được hiển thị bên dưới:

<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
   <role rolename = "tomcat"/>
   <role rolename = "role1"/>
   <role rolename = "manager"/>
   <role rolename = "admin"/>
   <user username = "tomcat" password = "tomcat" roles = "tomcat"/>
   <user username = "role1" password = "tomcat" roles = "role1"/>
   <user username = "both" password = "tomcat" roles = "tomcat,role1"/>
   <user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>

Tệp này xác định một ánh xạ đơn giản giữa username, passwordrole. Lưu ý rằng một người dùng nhất định có thể có nhiều vai trò; ví dụ,username = "both" là trong vai "tomcat" và vai "role1".

Khi bạn đã xác định và xác định các vai trò khác nhau, các hạn chế bảo mật dựa trên vai trò có thể được đặt trên các tài nguyên Ứng dụng Web khác nhau bằng cách sử dụng <security-constraint> yếu tố trong web.xml tệp có sẵn trong thư mục WEB-INF.

Sau đây là một mục nhập mẫu trong web.xml -

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>
            Let only managers use this app
         </description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>BASIC</auth-method>
   </login-config>
   ...
</web-app>

Các mục trên có nghĩa là -

  • Mọi yêu cầu HTTP GET hoặc POST đến một URL được khớp bởi / secure / * sẽ phải tuân theo giới hạn bảo mật.

  • Một người có vai trò quản lý được cấp quyền truy cập vào các tài nguyên được bảo đảm.

  • Các login-config phần tử được sử dụng để mô tả BASIC hình thức xác thực.

Nếu bạn thử duyệt qua bất kỳ URL nào bao gồm /securitythư mục, hộp thoại sau sẽ được hiển thị yêu cầu tên người dùng và mật khẩu. Nếu bạn cung cấp một người dùng"admin" và mật khẩu "secret", sau đó bạn sẽ có quyền truy cập vào URL khớp với /secured/* vì chúng tôi đã xác định quản trị viên người dùng với vai trò người quản lý được phép truy cập tài nguyên này.

Xác thực dựa trên biểu mẫu

Khi bạn sử dụng phương pháp xác thực MẪU, bạn phải cung cấp biểu mẫu đăng nhập để nhắc người dùng nhập tên người dùng và mật khẩu. Sau đây là một đoạn mã đơn giản củalogin.jsp. Điều này giúp tạo một biểu mẫu cho cùng mục đích -

<html>
   <body bgcolor = "#ffffff">
      
      <form method = "POST" action ="j_security_check">
         <table border = "0">
            <tr>
               <td>Login</td>
               <td><input type = "text" name="j_username"></td>
            </tr>
            <tr>
               <td>Password</td>
               <td><input type = "password" name="j_password"></td>
            </tr>
         </table>
         <input type = "submit" value = "Login!">
      </form>
      
   </body>
</html>

Ở đây bạn phải đảm bảo rằng biểu mẫu đăng nhập phải chứa các thành phần biểu mẫu có tên j_usernamej_password. Hành động trong<form> thẻ phải là j_security_check. POSTphải được sử dụng làm phương thức biểu mẫu. Đồng thời, bạn sẽ phải sửa đổi<login-config> để chỉ định phương thức auth dưới dạng FORM -

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>Let only managers use this app</description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>FORM</auth-method>
      <form-login-config>
         <form-login-page>/login.jsp</form-login-page>
         <form-error-page>/error.jsp</form-error-page>
      </form-login-config>
   </login-config>
   ...
</web-app>

Bây giờ khi bạn cố gắng truy cập bất kỳ tài nguyên nào bằng URL /secured/*, nó sẽ hiển thị biểu mẫu trên yêu cầu id người dùng và mật khẩu. Khi vùng chứa nhìn thấy "j_security_check", nó sử dụng một số cơ chế nội bộ để xác thực người gọi.

Nếu đăng nhập thành công và người gọi được ủy quyền truy cập tài nguyên được bảo mật, thì vùng chứa sử dụng id phiên để xác định phiên đăng nhập cho người gọi từ thời điểm đó trở đi. Vùng chứa duy trì phiên đăng nhập bằng cookie có chứa id phiên. Máy chủ gửi cookie trở lại máy khách và miễn là người gọi trình bày cookie này với các yêu cầu tiếp theo, thì vùng chứa sẽ biết người gọi là ai.

Nếu đăng nhập không thành công, thì máy chủ sẽ gửi lại trang được xác định bởi cài đặt trang lỗi biểu mẫu

Đây, j_security_checklà hành động mà các ứng dụng sử dụng đăng nhập dựa trên biểu mẫu phải chỉ định cho biểu mẫu đăng nhập. Trong cùng một biểu mẫu, bạn cũng nên có một điều khiển nhập văn bản được gọi làj_username và một password input control gọi là j_password. Khi bạn nhìn thấy điều này, điều đó có nghĩa là thông tin có trong biểu mẫu sẽ được gửi đến máy chủ, máy chủ sẽ kiểm tra tên và mật khẩu. Làm thế nào điều này được thực hiện là máy chủ cụ thể.

Kiểm tra Triển khai Vương quốc chuẩn để hiểu cáchj_security_check hoạt động cho Tomcat container ..

Bảo mật có lập trình trong Servlet / JSP

Các HttpServletRequest đối tượng cung cấp các phương thức sau, có thể được sử dụng để khai thác thông tin bảo mật trong thời gian chạy:

Không. Phương pháp & Mô tả
1

String getAuthType()

Các getAuthType() phương thức trả về một đối tượng Chuỗi đại diện cho tên của lược đồ xác thực được sử dụng để bảo vệ Servlet.

2

boolean isUserInRole(java.lang.String role)

Các isUserInRole() phương thức trả về một giá trị boolean: true nếu người dùng đang ở trong vai trò đã cho hoặc false nếu họ không có.

3

String getProtocol()

Các getProtocol()phương thức trả về một đối tượng Chuỗi đại diện cho giao thức được sử dụng để gửi yêu cầu. Giá trị này có thể được kiểm tra để xác định xem một giao thức an toàn đã được sử dụng hay chưa.

4

boolean isSecure()

Các isSecure()phương thức trả về một giá trị boolean đại diện nếu yêu cầu được thực hiện bằng HTTPS. Giá trị true có nghĩa là nó đã tồn tại và kết nối được bảo mật. Giá trị false nghĩa là yêu cầu không phải.

5

Principle getUserPrinciple()

Các getUserPrinciple() phương thức trả về một đối tượng java.security.Principle có chứa tên của người dùng được xác thực hiện tại.

Ví dụ: đối với Trang JavaServer liên kết đến các trang dành cho người quản lý, bạn có thể có mã sau:

<% if (request.isUserInRole("manager")) { %>
   <a href = "managers/mgrreport.jsp">Manager Report</a>
   <a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>

Bằng cách kiểm tra vai trò của người dùng trong JSP hoặc servlet, bạn có thể tùy chỉnh Trang web để chỉ hiển thị cho người dùng những mục mà họ có thể truy cập. Nếu bạn cần tên của người dùng như được nhập vào biểu mẫu xác thực, bạn có thể gọigetRemoteUser trong đối tượng yêu cầu.

Trong chương này, chúng ta sẽ thảo luận về khái niệm Quốc tế hóa trong JSP. Trước khi tiếp tục, hãy để chúng tôi hiểu ba điều khoản quan trọng sau:

  • Internationalization (i18n) - Điều này có nghĩa là cho phép một trang web cung cấp các phiên bản nội dung khác nhau được dịch sang ngôn ngữ hoặc quốc tịch của khách truy cập.

  • Localization (l10n) - Điều này có nghĩa là thêm tài nguyên vào một trang web để điều chỉnh nó cho phù hợp với một khu vực địa lý hoặc văn hóa cụ thể, chẳng hạn như bản dịch tiếng Hindi cho một trang web.

  • locale- Đây là một vùng văn hóa hoặc địa lý cụ thể. Nó thường được gọi là ký hiệu ngôn ngữ theo sau là ký hiệu quốc gia được phân tách bằng dấu gạch dưới. Ví dụ, "en_US"đại diện cho ngôn ngữ tiếng Anh cho Hoa Kỳ.

Có một số mục cần được quan tâm trong khi xây dựng một Trang web toàn cầu. Hướng dẫn này sẽ không cung cấp cho bạn chi tiết đầy đủ về điều này nhưng nó sẽ cung cấp cho bạn một ví dụ điển hình về cách bạn có thể cung cấp Trang web của mình bằng các ngôn ngữ khác nhau cho cộng đồng internet bằng cách phân biệt vị trí của họ, tức là, ngôn ngữ.

JSP có thể chọn phiên bản thích hợp của trang web dựa trên ngôn ngữ của người yêu cầu và cung cấp phiên bản trang web phù hợp theo ngôn ngữ, văn hóa và yêu cầu của địa phương. Sau đây là phương thức của đối tượng request trả về đối tượng Locale.

java.util.Locale request.getLocale()

Phát hiện ngôn ngữ

Sau đây là các phương pháp ngôn ngữ quan trọng mà bạn có thể sử dụng để phát hiện requester's location, language và tất nhiên locale. Tất cả các phương pháp dưới đây hiển thị tên quốc gia và tên ngôn ngữ được đặt trong trình duyệt của người yêu cầu.

Không. Phương pháp & Mô tả
1

String getCountry()

Phương thức này trả về mã quốc gia / vùng ở dạng chữ hoa cho ngôn ngữ này ở định dạng ISO 3166 2 chữ cái.

2

String getDisplayCountry()

Phương thức này trả về tên cho quốc gia của ngôn ngữ thích hợp để hiển thị cho người dùng.

3

String getLanguage()

Phương thức này trả về mã ngôn ngữ bằng chữ thường cho ngôn ngữ này ở định dạng ISO 639.

4

String getDisplayLanguage()

Phương thức này trả về tên cho ngôn ngữ của miền địa phương thích hợp để hiển thị cho người dùng.

5

String getISO3Country()

Phương thức này trả về ba chữ cái viết tắt cho quốc gia của ngôn ngữ này.

6

String getISO3Language()

Phương thức này trả về ba chữ cái viết tắt cho ngôn ngữ của miền địa phương này.

Thí dụ

Ví dụ sau đây cho thấy cách hiển thị ngôn ngữ và quốc gia liên quan cho một yêu cầu trong JSP:

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%
   //Get the client's Locale
   Locale locale = request.getLocale();
   String language = locale.getLanguage();
   String country = locale.getCountry();
%>

<html>
   <head>
      <title>Detecting Locale</title>
   </head>

   <body>
      <center>
         <h1>Detecting Locale</h1>
      </center>
      
      <p align = "center">
         <% 
            out.println("Language : " + language  + "<br />");
            out.println("Country  : " + country   + "<br />");
         %>
      </p>
   </body>
</html>

Cài đặt ngôn ngữ

JSP có thể xuất một trang được viết bằng ngôn ngữ Tây Âu như tiếng Anh, tiếng Tây Ban Nha, tiếng Đức, tiếng Pháp, tiếng Ý, tiếng Hà Lan, v.v. Ở đây, điều quan trọng là phải đặt tiêu đề Content-Language để hiển thị tất cả các ký tự đúng cách.

Một điểm quan trọng khác là hiển thị tất cả các ký tự đặc biệt bằng cách sử dụng các thực thể HTML; ví dụ,"&#241;" đại diện "ñ""&#161;" đại diện "¡" như sau -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>

<%
   // Set response content type
   response.setContentType("text/html");
   
   // Set spanish language code.
   response.setHeader("Content-Language", "es");
   String title = "En Español";
%>

<html>
   <head>
      <title><%  out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><%  out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>En Español</p>
         <p>¡Hola Mundo!</p>
      </div>
   </body>
</html>

Ngày cụ thể theo ngôn ngữ

Bạn có thể dùng java.text.DateFormat lớp và tĩnh của nó getDateTimeInstance( )phương pháp để định dạng ngày và giờ cụ thể cho ngôn ngữ. Sau đây là ví dụ cho thấy cách định dạng ngày cụ thể cho một ngôn ngữ nhất định -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.DateFormat,java.util.Date" %>

<%
   String title = "Locale Specific Dates";
   
   //Get the client's Locale
   Locale locale = request.getLocale( );
   
   String date = DateFormat.getDateTimeInstance(
      DateFormat.FULL, 
      DateFormat.SHORT, 
      locale).format(new Date( ));
%>

<html>
   
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>Local Date: <%  out.print(date); %></p>
      </div>
   </body>
</html>

Đơn vị tiền tệ cụ thể của địa phương

Bạn có thể dùng java.txt.NumberFormat lớp và tĩnh của nó getCurrencyInstance( )phương pháp để định dạng một số, chẳng hạn như kiểu dài hoặc kiểu kép, trong một ngôn ngữ cụ thể. Sau đây là ví dụ cho thấy cách định dạng tiền tệ cụ thể cho một ngôn ngữ cụ thể -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.NumberFormat,java.util.Date" %>

<%
   String title = "Locale Specific Currency";
   
   //Get the client's Locale
   Locale locale = request.getLocale( );
   
   NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
   String formattedCurr = nft.format(1000000);
%>

<html>
   
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>Formatted Currency: <%  out.print(formattedCurr); %></p>
      </div>
   </body>
</html>

Tỷ lệ phần trăm cụ thể theo ngôn ngữ

Bạn có thể dùng java.txt.NumberFormat lớp và tĩnh của nó getPercentInstance( )phương pháp để nhận tỷ lệ phần trăm cụ thể của ngôn ngữ. Ví dụ sau cho thấy cách định dạng phần trăm cụ thể cho một ngôn ngữ nhất định -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.NumberFormat,java.util.Date" %>

<%
   String title = "Locale Specific Percentage";
   
   //Get the client's Locale
   Locale locale = request.getLocale( );
   
   NumberFormat nft = NumberFormat.getPercentInstance(locale);
   String formattedPerc = nft.format(0.51);
%>

<html>
   
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>Formatted Percentage: <%  out.print(formattedPerc); %></p>
      </div>
   </body>
</html>