在Java的Struts框架下停止web編程的入門教程。本站提示廣大學習愛好者:(在Java的Struts框架下停止web編程的入門教程)文章只能為提供參考,不一定能成為您想要的結果。以下是在Java的Struts框架下停止web編程的入門教程正文
當點擊一個超鏈接或提交一個HTML表單在Struts2 的 Web運用法式,輸出所搜集被發送到一個Java類稱為操作掌握器。當舉措履行後,成果選擇了一個資本來出現呼應。資本平日是一個JSP,但它也能夠是一個PDF文件,Excel電子表格,或一個Java applet 窗口。
假定曾經樹立開辟情況。如今讓我們持續為第一個 “Hello World” 的 struts2 項目構建。這個項目標目標是樹立一個Web運用法式,它搜集用戶的姓名,並顯示“Hello World” 用戶名。我們將創立任何Struts2項目標四個構成部門:
我盤算應用Eclipse IDE,所以一切必須的組件將創立一個靜態Web項面前目今。所以,讓我們開端創立靜態Web項目。
創立靜態Web項目:
啟動Eclipse,然後再 File > New > Dynamic Web Project 輸出工程稱號為 HelloWorldStruts2 並設置屏幕中給出其他的選項:
選擇在接上去的畫面中的一切默許選項和最初檢討 Generate Web.xml deployment descriptor 選項. 這將創立一個靜態Web項目在Eclipse。如今去 Windows > Show View > Project Explorer, 會看到項目窗口的器械以下:
如今復制以下文件從struts 2 lib 文件夾 C:struts-2.2.3lib 到工程 WEB-INFlib 文件夾,要做到這一點,你可以簡略地將以下的一切文件拖放復制到WEB-INF lib文件夾。
創立舉措類:
Action類是 Struts2 運用法式的症結,我們完成的年夜部門舉措類中的營業邏輯。是以,讓我們創立一個Java文件HelloWorldAction.java Java Resources > src 鄙人面給出的內容包名 com.yiibai.struts2 。
Action類呼應用戶操作,當用戶點擊一個URL。 Action類中的辦法中的一個或多個被履行並前往一個字符串成果。基於成果的值,一個特定的JSP頁面的出現方法。
package com.yiibai.struts2; public class HelloWorldAction{ private String name; public String execute() throws Exception { return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
這是一個異常簡略的類,一個名為“name”屬性。我們有尺度的“name”屬性的getter和setter辦法,並前往字符串“success”的履行辦法。
Struts2框架將創立一個對象HelloWorldAction類並挪用履行辦法在呼應用戶的舉措。把營業邏輯外面的execute辦法,最初前往的字符串常量。簡略地說為每一個網址,必需履行一個舉措類,要末便可以直接應用這個類的稱號作為操作名,也能夠應用struts.xml文件以下所示映照到一些其他的名字。
創立視圖
我們須要一個JSP提交最初的新聞,這個頁面會被稱為Struts2框架一個預界說的舉措時,會產生這類映照將被界說在struts.xml文件。是以,讓我們一路發明在Eclipse項目在WebContent文件夾上面的jsp文件helloWorld.jsp。要做到這一點,右鍵單擊WebContent文件夾在項目資本治理器,選擇New >JSP File。 .
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World</title> </head> <body> Hello World, <s:property value="name"/> </body> </html>
taglib指令告知Servlet容器,這個頁面將應用Struts 2的標簽,這些標簽將之前由s。 s:property標簽顯示舉措類屬性"name> HelloWorldAction類的getName()辦法前往的值。
創立主頁:
我們還須要在WebContent文件夾中創立的index.jsp。該文件將作為初始舉措URL,用戶可以在個中點擊告知Struts 2框架挪用 HelloWorldAction類界說的辦法出現 helloWorld.jsp 視圖。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello World</title> </head> <body> <h1>Hello World From Struts2</h1> <form action="hello"> <label for="name">Please enter your name</label><br/> <input type="text" name="name"/> <input type="submit" value="Say Hello"/> </form> </body> </html>
Hello 舉措界說在下面的視圖文件將被映照到HelloWorldAction類和其履行辦法應用struts.xml文件。當用戶點擊“提交”按鈕,將招致Struts2框架運轉的履行辦法界說的在個中,HelloWorldAction類依據前往值的辦法,將響應的視圖選擇和襯著作為呼應。
設置裝備擺設文件
我們須要一個映照,以合營網址,HelloWorldAction類(模子),和的helloWorld.jsp的(視圖)。映照講述了Struts 2框架類將呼應用戶的操作(URL),這個類的辦法將被履行,檢查襯著基於字符串成果,該辦法前往。
是以,讓我們創立一個名為struts.xml中。因為Struts2 請求struts.xml中存在類“文件夾中。是以,創立struts.xml文件的WebContent/ WEB-INF/classes文件夾下。 Eclipse不創立“classes”文件夾,所以須要本身做。要做到這一點,在項目資本治理器的WEB-INF文件夾上點擊右鍵並選擇New > Folder。struts.xml中應當像如許:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
下面的設置裝備擺設文件的幾句話。在這裡,我們設置為 true常量struts.devMode,由於我們正在法式開辟情況,我們須要看到一些有效的日記新聞。然後,我們界說了一個名為HelloWorld 包。創立一個包是有效的,當想一路停止分組舉措。在我們的例子中,我們將我們的行為定名為“hello”,這是響應的URL /hello.action 和備份HelloWorldAction.class。履行HelloWorldAction.class辦法是運轉時URL /hello.action 挪用的辦法。假如履行辦法的成果前往“success”,然後我們把用戶到 helloWorld.jsp。
下一步是創立一個web.xml文件,這是一個Struts2的任何要求的進口點。Struts2運用法式的進口點,將是一個安排描寫符(web.xml)中界說的過濾器。是以,我們將界說在web.xml中條目oforg.apache.struts2.dispatcher.FilterDispatcher類。 web.xml文件中須要創立的WEB-INF文件夾下的WebContent下。曾經樹立的Eclipse的web.xml文件時為創立項目。所以,讓我們只須要修正以下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
我們曾經指定index.jsp的迎接文件。然後,我們曾經設置裝備擺設Struts2的過濾器上運轉的一切URL(即任何URL婚配形式/ *)
啟用具體日記:
可以啟用完全的日記記載功效,而Struts 2的WEB-INF/classes下文件夾創立logging.properties文件。堅持在屬性文件中的以下兩行:
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler
默許logging.properties指定ConsoleHandler的路由記載到stdout,也是一個文件處置器。處置法式的日記級別阈值可以設置應用 SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST 或 ALL.
就是如許。我們曾經預備好應用Struts 2框架來運轉我們的Hello World運用法式。
履行運用法式
右鍵點擊項目稱號,並單擊 Export > WAR File文件創立一個WAR文件。然後安排在Tomcat 的 webapps目次下這個WAR。最初,啟動Tomcat 辦事器和測驗考試拜訪URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:
輸出一個值“Struts2”,並提交頁面。應當看到頁面以下:
留意,可以界說索引struts.xml文件中的舉措,在這類情形下,可以挪用索引頁http://localhost:8080/HelloWorldStruts2/index.action。上面檢討若何界說指數作為一個舉措:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="index"> <result >/index.jsp</result> </action> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
一個實例演示struts:先生學籍查詢(隱約查詢)
需求剖析:查詢先生學籍,要觸及到數據庫的操作,要觸及到頁面的表單操作。
輸出先生名字,點擊隱約查詢。會前往查詢成果。
這裡目標只是顯示struts的常識點。頁面操作等具體細節不做過量請求。
在以上的基本上,在temp包下新建QueryForm.java和QueryAction.java 在src下新建兩個包,一個是bean文件的,一個操作數據庫的,分離是com.bean和com.dao。com.bean下新建StudentBean.java文件com.dao下新建StudentDao.java文件
WebRoot新建queryform.jsp文件和result.jsp文件index.jsp可以做導航頁面(新建工程時既有)。
各個文件的內容以下:
StudentBean.java文件:
package com.bean; //封裝一個先生的材料 public class StudentBean { private String stuId; private String stuName; private String stuSex; private String stuBir; private String stuAdd; public String getStuId() { return stuId; } public void setStuId(String stuId) { this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuSex() { return stuSex; } public void setStuSex(String stuSex) { this.stuSex = stuSex; } public String getStuBir() { return stuBir; } public void setStuBir(String stuBir) { this.stuBir = stuBir; } public String getStuAdd() { return stuAdd; } public void setStuAdd(String stuAdd) { this.stuAdd = stuAdd; } } StudentDao.java文件: package com.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import com.bean.StudentBean; public class StudentDao { private Connection conn = null; public void initConnection() { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager .getConnection("jdbc:sqlserver://localhost:1433;" + " DatabaseName=先生學籍信息", "sa", "sa"); } catch (Exception e) { } } public ArrayList queryStuByName(String sname) { ArrayList stus = new ArrayList(); String sql = "select 學號,姓名,性別,出身年代," + "家庭住址 from 學籍表 where 姓名 like '%" + sname + "%'"; //System.out.println("StudentDao.java中queryStuByName函數sname="+sname); try { this.initConnection(); ResultSet rs = conn.createStatement().executeQuery(sql); while (rs.next()) { StudentBean stu = new StudentBean(); stu.setStuId(rs.getString("學號")); stu.setStuName(rs.getString("姓名")); stu.setStuSex(rs.getString("性別")); stu.setStuBir(rs.getString("出身年代")); stu.setStuAdd(rs.getString("家庭住址")); stus.add(stu); } } catch (SQLException e) { e.printStackTrace(); } finally { this.closeConnection(); } return stus; } public void closeConnection() { try { if (conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } }
index.jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> <a href="queryform.jsp">先生學籍查詢</a> </body> </html>
queryform.jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'queryform.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 查詢表單 <br> <form action="/Project02/query.do" method="post"> 請您輸出先生姓名:<input name="sname"> <input type="submit" value="隱約查詢"> </form> </body> </html>
result.jsp文件:
<%@page import="com.bean.StudentBean"%> <%@page import="com.dao.StudentDao"%> <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'queryform.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body>
前往成果頁面
<br> <%ArrayList stus =(ArrayList)request.getAttribute("stus"); %> <table> <tr> <td> 學號 </td> <td> 姓名 </td> <td> 性別 </td> <td> 出身年代 </td> <td> 家庭住址 </td> </tr> <% for(int i=0;i<stus.size();i++){ StudentBean stu=(StudentBean)stus.get(i); %> <tr> <td> <%=stu.getStuId() %> </td> <td> <%=stu.getStuName() %> </td> <td> <%=stu.getStuSex() %> </td> <td> <%=stu.getStuBir() %> </td> <td> <%=stu.getStuAdd() %> </td> </tr> <%} %> </table> </body> </html>
QueryForm.jsp文件:
package project02; import org.apache.struts.action.ActionForm; //這是ActionForm為了包容表單的值 //標准: //1-必需繼續org.apache.struts.action.ActionForm //2-必需編寫和表單位素重名的元素屬性 //3-必需在Struts設置裝備擺設文件中注冊 @SuppressWarnings("serial") public class QueryForm extends ActionForm{ public QueryForm(){ System.out.println("QueryForm.java結構函數運轉"); } private String sname; public String getSname() { System.out.println("QueryForm.java中getSname函數運轉"); return sname; } public void setSname(String sname) { this.sname = sname; System.out.println("QueryForm.java中setSname函數運轉"); } } queryAction.java文件: package project02; import java.util.ArrayList; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.dao.StudentDao; //QueryAction擔任吸收ActionForm的數據,然落後行處置 //規矩: //1-必需繼續org.apache.struts.action.Action //2-重寫excute辦法營業邏輯 //3-將這個類在設置裝備擺設文件中注冊 public class QueryAction extends Action{ public QueryAction(){ System.out.println("QueryAction.java結構函數運轉"); } @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { QueryForm queryForm=(QueryForm)form; String sname=queryForm.getSname(); sname=new String(sname.getBytes("iso-8859-1"),"gb2312"); StudentDao studentDao=new StudentDao(); ArrayList stus=studentDao.queryStuByName(sname); request.setAttribute("stus", stus); System.out.println("QueryAction.java中execute函數運轉"); // 跳轉 ActionForward af=new ActionForward("/result.jsp"); //設置了設置裝備擺設文件可以用以下方法跳轉 // ActionForward af = mapping.findForward("RESULT"); //以上方法湧現異常正告:正告: Unable to find 'RESULT' forward. return af; } }
編寫了以上的文件還未能完成struts的功效,要對各個文件之間的關系在struts-config.xml文件停止設置裝備擺設。
設置裝備擺設以下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <!-- 在此注冊ActionForm --> <form-beans> <!-- name:稱號 type:類的途徑 --> <form-bean name="queryForm" type="project02.QueryForm"></form-bean> </form-beans> <global-exceptions /> <!-- 設置URL的邏輯稱號 全局性的,所以的Action都可以辨認到--> <global-forwards> <forward name="RESULT" path="/result.jsp"></forward> </global-forwards> <!-- 這裡注冊Action --> <action-mappings> <!-- name:Actionform的稱號 type:類的途徑 path:客戶端提交給辦事器暫時指定的途徑 --> <action name="queryForm" path="/query" type="project02.QueryAction"></action> </action-mappings> <message-resources parameter="project02.ApplicationResources" /> </struts-config>
最初,對工程文件停止宣布,啟動tomcat,用閱讀器測試。
如今,來梳理清晰。依據需求樹立功效。依據請求樹立form和action文件。最初對struts-config.xml文件停止設置裝備擺設。
測試操作步調:
1-進入index.jsp導航頁面,點擊先生學籍查詢進入了queryform.jsp頁面
2-進入了queryform.jsp頁面,在文本框輸出先生名中的一個或兩個字停止隱約查詢。點擊隱約查詢。
<form action="/Project02/query.do" method="post">
請您輸出先生姓名:<input name="sname">
<input type="submit" value="隱約查詢">
</form>
Action:指定了action要履行的途徑 method:提交的方法--post不顯示信息,get顯示信息
3-進入了/Project02/query.do 到了QueryAction.java履行。這裡為何是到QueryAction.java文件下履行的呢?
<!-- 在此注冊ActionForm --> <form-beans> <!-- name:稱號 type:類的途徑 --> <form-bean name="queryForm" type="project02.QueryForm"></form-bean> </form-beans> <!-- 這裡注冊Action --> <action-mappings> <!-- name:Actionform的稱號 type:類的途徑 path:客戶端提交給辦事器暫時指定的途徑 --> <action name="queryForm" path="/query" type="project02.QueryAction"></action> </action-mappings>
由於設置裝備擺設文件曾經完成了設置裝備擺設。注冊Action中的path=”/query”就是query.do只是沒有了.do後綴。這裡曾經指定了type類的途徑為:project02.QueryAction 所以履行QueryAction.java文件。
4-接上去的就是java文件了,年夜都能看懂。