1. 程式人生 > >J2EE學習篇之--Struts1詳解

J2EE學習篇之--Struts1詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

今天來看一下Struts1的相關知識,其實Struts現在是出名的,每個Web開發者都會知道的,也是現在比較流行的框架,下面就來看一下我們為什麼要用Struts框架呢?


摘要

1.建立在mvc這種好的模式上的,Struts在m,v,c上都有涉及,但主要的是提供一個好的控制器和一套定製的標籤庫上也就是說它在這裡體現在c和v上,有mvc的一系列的優點,如:結構層次分明,高重用性,增加了程式的健壯性和可伸縮性,便於開發與設計分工,提供集中統一的許可權的控制,校驗,國際化,日誌等等
2.開源專案,得到了包括它的發明者Craig R.McClanahan在內的一些程式大師和高手持續而細心的呵護,並且經受了實戰的檢驗,使其功能越來越強大。
3.其他技術和框架具有很好的融合性,如與Spring,hibernate等框架的整合
4.大大提高了開發速度


框架的概念和struts的概念和體系結構

1.Framework概念

人們用於解決相同或者相似型別問題的方案。
特點:可重用性,可擴充套件性,可收縮性。基於請求響應(Request-response)模式的應用Framework的邏輯結構
控制器(Controller)
業務邏輯層(Business Logic)
資料邏輯層(Data Logic)


2.Struts的概念和體系結構

struts是Apache組織的一個開源的專案,主要是採用Servlet和Jsp技術來實現的,Struts是一個基於Sun JavaEE 平臺大的MVC框架,它採用了MVC模式,將MVC模式“分離顯示邏輯和業務邏輯”的能力發揮的淋漓盡致

Struts工作原理結構

WebBroser——>UserAction———>Front end Controller ActionServlet——>Back End Controller Action——>Model JavaBean



搭建配置環境

1.新建web工程


2.加入必要的jar包


當然還可能需要其他的jar,這個在實際應用用遇到問題或者報錯,我們可以新增相應的jar,而沒必要刻意的去記住哪些jar


3.在WEB-INF下加入配置檔案struts-config.xml

主要在這裡我們需要配置我們定義的ActionForm,和Action

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE struts-config PUBLIC          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"          "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config>    <form-beans>    </form-beans>    <action-mappings>      <action path=""></action>         </action-mappings></struts-config>

4.配置web.xml

配置Struts中的總控制器ActionServlet,把配置檔案作為一個例項化引數的值傳進來的(這裡可以傳遞多個配置檔案的,中間使用逗號進行分割的,具體可以檢視原始碼ActionServlet),而且我們還看到這個servlet的啟動優先順序是0,也就是最高的優先順序,這個只是我們在之前JavaWeb學習篇中的Servlet中說過,還有就是要配置訪問的對映url,這裡是只要字尾名是.do的就可以

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet>  <servlet-name>action</servlet-name>  <servlet-class>   org.apache.struts.action.ActionServlet  </servlet-class>  <init-param>   <param-name>config</param-name>   <param-value>/WEB-INF/struts-config.xml</param-value>  </init-param>  <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping>  <servlet-name>action</servlet-name>  <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list>  <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>


開發第一個struts程式

1.開發form

1)建立一個類,繼承ActionForm
2)註冊,修改struts-config.xml
Name:變數名
Type:類的全名
例如:

<form-beans> <form-bean name="loginForm" type="cn.com.hewei.bean.LoginForm"/></form-beans>


2.開發Action

1) 建立一個類,繼承Action覆蓋execute方法

2) 註冊,修改strutrs-config.xml

Path:指明呼叫者(jsp)能通過中心控制器ActionServlt找到該Action

Type:指明該Action的類名

Name:該Action應用的Form名稱


3.例項:模擬使用者的登入,第一個使用者程式

1)寫bean程式,繼承ActionForm
package cn.com.hewei.Bean;import org.apache.struts.action.ActionForm;public class LoginForm extends ActionForm private String userName; private String password; public String getUserName() {  return userName; } public void setUserName(String userName) {  this.userName = userName; } public String getPassword() {  return password; } public void setPassword(String password) {  this.password = password; }}

編寫Action程式

package cn.com.hewei.Action;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 cn.com.hewei.Bean.LoginForm;public class LoginAction extends Action @Override public ActionForward execute(ActionMapping mapping, ActionForm form,   HttpServletRequest request, HttpServletResponse response)   throws Exception {  // 轉換成LoginForm  LoginForm login = (LoginForm) form;  if (login.getUserName().equals("admin")) {   return mapping.findForward("loginSuccess");  } else {   return mapping.findForward("loginFail");  } }}

配置struts-config.xml檔案

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE struts-config PUBLIC          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"          "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config> <form-beans>  <form-bean name="loginForm"   type="cn.com.hewei.Bean.LoginForm">  </form-bean> </form-beans> <action-mappings>  <action path="/Login" type="cn.com.hewei.Action.LoginAction"   name="loginForm">   <forward name="loginSuccess" path="/loginSuccess.jsp"></forward>   <forward name="loginFail" path="/loginFail.jsp"></forward>  </action> </action-mappings></struts-config>
我們要注意一點所有的path=都要以“/”開頭


Login.jsp

<body> <form action="<%=request.getContextPath()%>/Login.do" method="post">  <!--這裡的uerName和passWord要和bean中的一模一樣-->  username:  <input type="text" name="userName">使用者名稱</input>  password:    <input type="text" name="passWord">密碼</input></br>  <input type="submit" value="提交">    <form></body>

登入成功頁面loginSuccess.jsp

<body>   Login Success <br></body>

登入失敗頁面loginFail.jsp
<body>   Login Fail <br></body>

原理分析:


1)在瀏覽器的位址列中輸入index.jsp
2)輸入使用者名稱密碼後點擊提交,跳轉到Login.do、
3)因為是.do結尾的所以會被web.xml的ActionServlet解析到,ActionServlet會檢視struts-config.xml檔案,根據action標籤的path和跳       轉到LoginAction這個Servlet目錄
4)跳轉時,會根據action的name屬性帶著ActionForm中的內容交給LoginAction處理
5)LoginAction處理好後根據findForward將跳轉的關鍵字帶給ActionServlet處理,ActionServlet會檢視Struts-config.xml檔案根據forward標籤,和name屬性(那麼屬性判斷帶來的關鍵字)跳轉到path指定的路徑


Struts的基本原理


1.讀取配置(初始化ModuleConfig物件)
Struts框架總控制器(ActionServlet)是一個Servelt,在web.xml中配置成自動啟動的Servlet,在Web.xml中配置成自動啟動的Servlet。讀取配置檔案(Struts-config.xml)的配置檔案資訊,為不同的Struts模組初始化響應的ModuleCofig物件:ActionConfig,ControlConfig,FormBeanConfig,ForwardConfig,MessageResourcesConfig(一定要記得看原始碼)
2.傳送請求
使用者提交表單或呼叫URL向web應用的程式器提交一個請求,請求的資料用HTTP協議上傳給Web伺服器
3.填充Form(例項化,復位,填充資料,校驗,儲存)
(*.do請求)從ActionConfig中找到對應該請求的Action的子類,如沒有對應的Action,控制器直接轉化給Jsp或靜態的頁面。如有對應的Action且這個Action有一個對應的ActionForm,ActionForm被例項化並用HTTP請求的資料填充其屬性,並且儲存在ServletConfig中(request或session中),這樣他們就可以被其他的Action物件或者Jsp呼叫了。這個後面會說到如何儲存這個form到各個域中
4.派發請求
控制器根據配置資訊ActionConfig將請求派發到具體的Action,相應的FormBean一併傳給這個Action的execute()方法
5.處理業務
Action一般只包含一個execute()方法,它負責執行相應的業務邏輯(呼叫其他業務模組)。完畢返回一個ActionFoward物件,控制器通過這個AcationForward物件進行轉發工作。
6.返回響應
Action根據業務邏輯處理的不同結果返回一個目標響應物件總控制器,該目標響應物件給總控制器,該目標響應物件對應一個具體的Jsp頁面或另一Action
7.查詢響應(翻譯響應)
總控制器根據業務功能Action返回的目標響應物件,找到對應的資源物件,通常是一個具體的jsp頁面.
8.響應客戶
目標響應物件結果展現給使用者目標響應物件(JSP)將結果頁面展現給使用者。


Struts的原理詳細分析

1.Struts元件

ActionServlet 

Acation Classes,

Action Mapping(此包括ActionForward)

ActionForm Bean。

2.Struts的Mvc

1.模型(Model):本質上來說在Struts中Model是一個商業邏輯類,開發者實現商業邏輯
2.檢視(View):View是與控制器Servelt配合工作的一整套Jsp定製標籤構成,利用他們可以快速建立應用系統的介面
3.控制器(Controller):前端控制器(總控制器)是一個Servlet,它將客戶端的請求轉發到響應的後端控制器Action類


3.ActionServlet(中心控制器)

定義:繼承自javax.servelt.http.HttpServlet類,是中心控制器(總控制器)。它提供了一箇中心位置來處理全部的終端請求
1)作用:接受請求,填充資料,派發請求,響應使用者
2)配置:在web配置檔案(web.xml)宣告:

<servlet> <servlet-class>  org.apache.struts.action.ActionServlet </servlet-class> <init-param>  <param-name>config</param-name>  <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup></servlet><servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern></servlet-mapping>


Action圖解


1.Action:一個請求和業務邏輯的介面卡

1)初始化時間:第一次請求的時候初始化,不是在讀取配置時初始化,
2)初始化次數:每個Action只被初始化一次(多個請求共享一個Action)
3)安全問題:Action是執行緒不安全的,因為所有的請求共享一個action例項
4)怎樣實現Action的安全性問題:
主要不要用例項變數或者類變數共享只是針對某個請求的資料
注意資源操作的同步性


例項:設計一個例項變數count,統計訪問的次數 

package cn.com.hewei.Action;import java.io.PrintWriter;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;public class CountAction extends Actionint count=0@Override //每個訪問一個execute方法 public ActionForward execute(ActionMapping mapping, ActionForm form,   HttpServletRequest request, HttpServletResponse response)   throws Exception {  response.setCharacterEncoding("gbk");  request.setCharacterEncoding("gbk");  synchronized (this) {   count++;    }  PrintWriter out=response.getWriter();  out.print("訪問的次數"+count);  return null; }}

配置檔案
<action path="/countAction" type="cn.com.hewei.Action.CountAction"/>

訪問連線
http://localhost:8081/Mystruts/countAction.do


2.ActionMapping和ActionForward

1).每個<action>元素都是類org.apache.struts.action.AcationMapping
2).ActionMapping中的方法(使用ActtionStudent例項)

public ActionForward execute(ActionMapping mapping, ActionForm form,  HttpServletRequest request, HttpServletResponse response)  throws Exception {   // 獲得Action的name   String name=mapping.getName();   // 獲得Action的type   String type=mapping.getType();   // 獲得Action的path   String path=mapping.getPath();   String []forwardNames=mapping.findForwards();   System.out.println("name  "+name);   System.out.println("path  "+path);   System.out.println("type  "+type);   for(String forwardName:forwardNames ){    ActionForward forward=mapping.findForward(forwardName);    String forwardPath=forward.getPath();    System.out.println("forwardName  "+forwardName);    System.out.println("forwardPath  "+forwardPath);   }  }

配置檔案
<action path="/addStudent" type="cn.com.hewei.Action.AddStudentAction"  name="AddStudentForm"> <forward name="addSuccess" path="/loginSuccess.jsp"></forward> <forward name="addFail" path="/loginFail.jsp"></forward></action>

輸出:
name  AddStudentForm
path  /addStudent
type  cn.com.hewei.Action.AddStudentAction
forwardName  addSuccess
forwardPath  /loginSuccess.jsp
forwardName  addFail
forwardPath  /loginFail.jsp


3. ActionForward(導航器)

ActionForWard物件是配置物件,這些配置物件擁有獨一無二的標識允許按照name屬性等檢索,ActionForward物件封裝了向前進的Url路徑且被請求處理器用於識別目標檢視
name:邏輯名稱
path:頁面或者模組的訪問路徑

redirect:控制轉發還是重定向

<forward name="addFail" path="/loginFail.jsp" redirect="true"/>

redirect=false 轉發(預設值)
redirect=false:RequestDispatch.forward
redirect=true  重定向
redirect=true:HttpServletResponse.sendRedirects


4.ActionForm

ActionForm工作原理
處理anctionForm的一般步驟
1)檢查Action的對映,確定Action中已經配置了對ActionForm的對映
2)根據name屬性,查詢formbean的配置資訊
3)檢查Action的formbean的使用範圍確定在此範圍下(request,session),是否已經有此formbean的例項<action scope=”request”>,預設是session
4)假如當前範圍下,已經存在了此form bean的例項,而且對於當請求來說,是同一種類型的話,那麼就重用
5)否則,就重新構建一個formbean的例項(呼叫構造方法),並且儲存在一定的作用範圍
6)form bean的reset()方法被呼叫
7)呼叫對應的setter方法,對狀態屬性賦值
(類似<jsp:setProperty name=”person” property=”*” >)
8)如果validate的屬性設定為true,那麼就呼叫form bean的validate()方法
<action validate=”true”>
9)如果validate()方法沒有返回任何的錯誤,控制器將ActionForm作為引數,傳給Action例項的execute()方法並執行
注意:直接從ActionForm類繼承的reset()和validate()方法,並不能實現什麼處理功能,所以有必要自己重新覆蓋

圖例:


注意:
1.無參建構函式必須要有(通過讀取配置檔案中的資訊進行例項化)
2.Scope預設值為session
我們怎麼檢視是否往scope中添加了元素了呢?我們可以使用監聽器來做(這個我們在前面說到Servlet中的監聽器和過濾器)
1)監聽HttpSessionAttributeListener,
ServletRequestAttributeListener介面

package cn.com.hewei.listener;import javax.servlet.ServletRequestAttributeEvent;import javax.servlet.ServletRequestAttributeListener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import org.apache.struts.action.ActionForm;public class ActionListener implements HttpSessionAttributeListener,ServletRequestAttributeListener public void attributeAdded(HttpSessionBindingEvent event) {  //得到session中的name  String attributeName=event.getName();  //得到session中的value,判斷是否是struts的類  if(event.getValue() instanceof ActionForm){      System.out.println("Add a Session Attribute");   System.out.println("name="+attributeName+",value="+event.getValue());  } } public void attributeReplaced(HttpSessionBindingEvent event) {  String attributeName=event.getName();  if(event.getValue() instanceof ActionForm){      System.out.println("Replace a Session Attribute");   System.out.println("name="+attributeName+",value="+event.getValue());  } } public void attributeAdded(ServletRequestAttributeEvent event) {  String attributeName=event.getName();  if(event.getValue() instanceof ActionForm){    System.out.println("Add a Request Attribute");   System.out.println("name="+attributeName+",value="+event.getValue());  } } public void attributeReplaced(ServletRequestAttributeEvent event) {  String attributeName=event.getName();  if(event.getValue() instanceof ActionForm){      System.out.println("Replace a Request Attribute");   System.out.println("name="+attributeName+",value="+event.getValue());  } }}

2)註冊監聽器

<listener> <listener-class>  cn.com.hewei.listener.ActionListener </listener-class></listener>


在Action中加入Scope=request,輸出
Add a Session Attribute
name=AddStudentForm,[email protected]


3.reset方法,是讓表當中的資料恢復預設值
4.呼叫setter方法,實際上是呼叫對應的標準set方法,比如username有setUsername()
5.<action validate=“false”>關閉校驗,預設自動校驗

6.配置檔案中的屬性
1)<action-mappings>元素
<action-mappings>元素幫助進行擴建內部的流程控制,可將請求的URL對映到Action類,將Action物件與ActionForm物件想相互聯,<action-mappings>元素內可以定義多個<action>子元素

2)<action>元素
所描述的是將特定的請求路徑和一個相應的Action類之間的對映關係,有以下的屬性
attribute:設定和Action關聯的formbean在request/session內的屬性key,通過request/session的getAttribute(attribute)方法返回該formbean例項(用來存取form的關鍵字,預設值和formbean標籤中的name一樣的)
validate:用來控制是否校驗表單,(校驗表單時,當返回null或者ActionErrors沒有帶ActionMessage資訊時,校驗成功)
input:當表單驗證失敗時請求轉發的URL,一般結合validate=“true“使用

public ActionErrors validate(ActionMapping mapping,  HttpServletRequest request) {  ActionErrors errors=new ActionErrors();  ActionMessage m=new ActionMessage("ss");  errors.add("error",m);  return errors;}

我們在jsp中可以通過<bean:errors property=”error”>獲得錯誤資訊


3)<global-forwards>全域性跳轉
<global-forwards>元素用於定義在整個應用程式內的全域性轉發,在該元素內可定義多個<forward>子元素
<global-forwards> <forward name=”error” path=”/error.jsp”></global-fowards>


自己開發Struts思路

1.ActionServlet

讀取配置dom4j
填充form
派發請求:呼叫對應的Action的execute方法。

查詢響應


2.ActionForm

set()/get()

reset()

validate()


3.Action

Execute(ActionMapping,ActionForm,HttpServletRequest,HttpServletResponse)


4.ActionMapping

屬性:path,type,name,validate,forwards(HashMap)


5.ActionForward

name,path


6.配置檔案

例項:模仿struts填充formbean


分析:
1)建立AddstudentForm物件----根據類的全名進行反射(Class.forName)
2)需要把頁面的引數提取出來(request.getParameterNames()----Enumeration)
3)把引數名與bean的屬性名進行匹配:如果能匹配就把取出來的值填充到bean中(藉助BeanUtils)
4)儲存form
設計一個FormUtil完成以上描述的功能

package cn.com.hewei.util;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.commons.beanutils.BeanUtils;import org.apache.struts.action.ActionForm;public class FormUtil public static void fillForm(HttpServletRequest request,   String formClassFullName, String ClassName)   throws InstantiationException, IllegalAccessException,   ClassNotFoundException, InvocationTargetException {// 例項化實體   ActionForm form = (ActionForm) Class.forName(formClassFullName).newInstance();   // 得到所有從網頁傳來的引數   Map parameters = request.getParameterMap();   // 得到所有bean中的引數   Field[] fields = Class.forName(formClassFullName).getDeclaredFields();   // 填充bean   BeanUtils.populate(ClassName, parameters);   // 往session中傳數   request.getSession().setAttribute(ClassName, form); }}


struts高階部分

1.Struts的標籤

1.1 struts標記庫

Jsp視窗元件所使用的struts標記庫由四類標記組成:

1)Bean標記:用來在Jsp頁中管理bean

2)邏輯標記:用來在Jsp頁中控制流程

3)Html標記:用來生成HTML標記,在表單中顯示資料,使用會話的ID對URL進行程式設計

Struts提供了很多表單相關的自定義標籤,如:
<html:text>
<html:radio>
<html:select>
<html:option>
<html:checkbox>
<html:multibox>
<html:textarea>
這些標籤除用於生成相應的html標籤外,最大的好處在於它在產生html標籤時,會自動檢索相應formbean的資料予以顯示,這樣,當表單校驗失敗時,表單資料的回顯struts幫我們幹了,開發人員就不需要再編碼去取了。

使用Struts的html標籤完成資料回顯時注意的問題:
html標籤回顯資料時,會以org.apache.struts.taglib.html.BEAN為關鍵字,從各個域中查詢bean,找不到則拋空指標異常。所以使用html標籤時域中須有以org.apache.struts.taglib.html.BEAN為關鍵字的物件。
這個工作可以交給html:form標籤做,html:form標籤在執行時,會查詢域中已有的formbean,並以org.apache.struts.taglib.html.BEAN為關鍵字把formbean存在域中。如果html:form標籤在域中找不到formbean,則html:form標籤會例項化一個空bean,然後儲存到域中。因此,為了在頁面中使用struts的html標籤回顯資料,這些標籤需要配合html:form標籤使用。(檢視html:form標籤的原始檔可以看到這點)。
對於複選框中的資料,Html:checkbox標籤不能完成資料回顯,複選框的資料回顯需要使用html:multibox。
Struts中的html:password標籤也會回顯資料,如果不想password回顯,需要把其redisplay屬性置為false。

4)tiles標記:使用動態模組構造普通格式的的頁


1. 2 Bean標記:

在標籤庫中包含用於定義新的bean,訪問bean及其屬性的標記,Bean標記庫將標記定義在四個子類別中:
建立和複製bean的標記
指令碼變數定義標記
bean翻譯標記
訊息國際化標記

1)Bean:define 從已有的變數或者變數的屬性定義一個新的變數
Serach:fromwhere---scope,who----name,which property---property
Define: 新定義的變數名是id屬性
Save:towhere---toScope
例項:從request中得到userName將其放到session中去

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%><!--taglib可以從struts-taglib.bean包中META-INF中的tld中找到--><%@ taglib uri="http://struts.apache.org/tags-bean" prefix="b"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>     <title>My JSP 'BeanUtil.jsp' starting page</title>  </head>  <body>   <%String userName="ss";request.setAttribute("userName",userName);%> <!--id是新定義的名稱,name是scope中的key值,toScope是將存到的域的值。如果是複合型別的值,定義property獲得是哪個引數的值--> <b:define id="name" name="userName" scope="request" toScope="session"/> ${sessionScope.name}  </body></html>

這裡注意的是scope是從哪個域中進行取值,toScope是將取出來的值放到哪個域中


Bean:write ,輸出域中的值
<b:write name="name" scope="session"/>

3)message 和jstl的<fmt:message>類似,國際化資訊
定義資原始檔:

com.itcast.AlliacationRescources.properties
com.itcast. AlliacationRescources_zh-CN.properties

下面是AlliacationRescources_zh-CN.properties的內容:


這個是UTF-8編碼之後的內容了


在struts-config中新增

<message-resources paremeter="com.itcast.ApplicationResources"key="myKey"/>

這裡的填寫的就是資原始檔的全稱地址,但是要注意不需要字尾名的,而且這裡可以配置多個資原始檔的


頁面中使用

<bean:message bundle=”myKey” key=”userName”><bean:message bundle=”myKey” key=”password’>
注意:上面配置的key=”myKey”和這裡的bundle=”myKey”可以不寫


1.3 邏輯標記

邏輯庫的標記能夠用來處理外觀邏輯而不需要使用scriptlet(這個屬性在我們之前說到的自定義標籤庫的時候用到了)。Struts邏輯標籤庫包含的標記能夠有條件的產生輸出文字,在物件集合中迴圈從而重複的產生輸出文字,應用程式流程控制,它也提供了一組在Jsp頁中處理流程控制的標記。這些標記封裝在檔名struts-logic.tld的標記 包中,邏輯標記庫定義的標記能夠執行下列三個功能
條件邏輯,重複,轉發/重定向響應
1.迴圈 iterate(相當於forEach標籤)
1)name:所指代的bean必須是一個集合型別
2)property:bean中的屬性
<logic:iterator id=”username’ scope=”request’  name=”userNames”>
   ${username}
</logic:iterator>
3)   offset 設定迴圈的起始值
4)indexId 當前迴圈的下標
5)length 長度


2.動態表單和異常處理

2.1 動態表單

它讓程式設計師不需要書寫formbean,只需要在配置檔案中配置即可
1)配置struts-config.xml

<form-bean name="dynStudentForm" type="org.apache.struts.action.DynaActionForm"> <!-- 這裡的type必須是完整的 --> <form-property name="sname" type="java.lang.String" /> <form-property name="birthday" type="java.sql.Date" /> <form-property name="major" type="java.lang.String" /> <form-property name="score" type="java.lang.Float" /></form-bean><action path="/dynAddStudent" type="cn.com.hewei.Action.DynAddStudentAction" name="dynStudentForm"> <forward name="addSuccess" path="/loginSuccess.jsp"></forward> <forward name="addFail" path="/loginFail.jsp"></forward></action>

系統呼叫
package cn.com.hewei.Action;import java.sql.Date;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 org.apache.struts.action.DynaActionForm;public class DynAddStudentAction extends Action @Override public ActionForward execute(ActionMapping mapping, ActionForm form,   HttpServletRequest request, HttpServletResponse response)   throws Exception {   DynaActionForm dynform = (DynaActionForm) form;   // 獲得資訊   String name = (String) dynform.get("sname");   Date birthday = (Date) dynform.get("birthday");   String major = (String) dynform.get("major");   Float score = (Float) dynform.get("score");   System.out.println("name=" + name + "birthday=" + birthday + "score="     + score);   return null; }}

2.2 struts中異常的處理

一.配置異常(在struts-config.xml檔案中定義)
定製異常有兩種:“全域性異常(Global Exceptions)”和區域性異常(Local Exception)
1.區域性異常定義如下:(寫在action的內部第一個)

<exception type="java.lang.Exception" path="/index.jsp" key="ss"></exception>
這裡的path是要跳轉的頁面,type是異常的型別,key是異常的關鍵字,相應action中execute丟擲異常就會跳到這裡處理

 2.全域性異常的配置

<global-exceptions> <exception type="java.lang.Exception" path="/index.jsp" key="ss"></exception></global-exceptions>

2.3.得到異常的資訊

我們可以通過exception中的key關鍵字到配置檔案中找到配置檔案的資訊
1)寫異常檔案
 ApplicationResource.properties
在其中輸入資訊:<exception>標籤中key的值 = 異常的描述
例:ss=it is a validare user

2)註冊異常檔案(檔案的末尾不要加.properties)
<message-resources parameter="cn.com.hewei.bean. ApplicationResource"></message-resources>

3)在頁面輸出異常的資訊
在頁面註冊taglib
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
呼叫
<html:errors/>  輸出所有的異常資訊

2.4 struts中外掛的使用

1.介面為Plugin,生命週期方法:init和destroy
2.使用者提供setter方法,告訴ActionServlet中心控制器設定屬性
應用:在struts啟動的時候把hibernate載入進來(讀取hibernate配置檔案和開啟hibernate的sessionfactory)。
1)struts 的jar包+hibernate的jar包
2)設計一個類:HibernatePlugin實現plugin介面 
屬性:String  hibernateConfigFile
讀取hibernate配置檔案
開啟SessionFactory
釋放資源
3)在struts-config配置檔案中填上一對<plugin>,在plugin中加上子標籤
例項:
工具類:
package cn.com.hewei.plugin;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class SessionFactoryManager private static String hibernateConfigFile = nullpublic static String 
            
           

相關推薦

J2EE學習--Struts1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JavaWeb學習----Jsp

今天我們來看一下Jsp的相關知識,首先來看看一下Jsp的相關定義: 簡介: JSP全稱是JavaServer Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。 JSP這門技術的最大的特點在於,寫jsp就像在寫html,但: 它相

系統學習前端FormData

pan 3.2 第一個 實例 open password 訪問表 -name 訪問 FormData1. 概述FormData類型其實是在XMLHttpRequest 2級定義的,它是為序列化表以及創建與表單格式相同的數據(當然是用於

JAVA學習14——集合

概述: List , Set, Map都是介面,前兩個繼承至Collection介面,Map為獨立介面 Set下有HashSet,LinkedHashSet,TreeSet List下有ArrayList,Vector,LinkedList Map下有Hashta

shader學習基礎uv座標與加入數學演算法控制uv座標的原理

這三個是我們本篇文章需要解決的內容! 第一,我們首先了解uv座標是什麼,我的理解是uv圖的座標!那uv圖是什麼,我們可以用一個座標軸來表示: 上圖所示,uv座標對應的就是座標軸上的位置和座標,而map指的就是我們的貼圖,正常情況下map和uv是對應的1比1的關係,但是我

Android學習筆記選單

選單概述 每個Activity都可以指定它自己的選單,按下硬體選單鍵即可顯示選項選單。。但是從 Android 3.0(API 級別 11)開始,硬體選單就變成了可選擇的。Activity推薦使用應用欄和溢位選單來代替傳統的6鍵選單。儘管某些選單項的設計和使用

phaser學習總結Tween

前言 在上一章phaser學習總結之phaser入門教程中,我們已經初步入門了phaser,並通過一個案例瞭解了phaser,現在我們需要對phaser中的物件進行講解,本章需要講解的是tween,即phaser中的補間動畫,一起來學習一下吧! 引數詳解 (1):from和to方法 語法: from

JavaWeb學習----自定義標籤 JSTL標籤庫

                今天來看一下自定義標籤的內容,自定義標籤是JavaWeb的一部分非常重要的核心功能,我們之前就說過,JSP規範說的很清楚,就是Jsp頁面中禁止編寫一行Java程式碼,就是最好不要有Java指令碼片段,下面就來看一下自定義標籤的簡介:自定義標籤主要用於移除Jsp頁面中的java程

JavaWeb學習----容器Request

前篇說到了Response容器物件,這篇我們就來看一下Request容器物件,之前也說過了,這個兩個容器物件是相對應的,每次使用者請求伺服器的時候web容器就會給建立這對容器物件,他們是共存亡的,當然Request除了有一個容器物件的角色,他還有一個角色就是Request域

JavaWeb學習----容器Response

今天在來看一下Response容器的相關知識,其實這篇blog早就應該編寫了,只是最近有點忙,所以被中斷了。下面我們就來看一下Response容器的相關知識吧。Response和我們即將在後面說到的Request容器是一一對應的,他是web容器在使用者每次請求服務端的時候,

JavaWeb學習----容器Response(有關response setCharacterEncoding和setContentType)詳細對比說明

今天在來看一下Response容器的相關知識,其實這篇blog早就應該編寫了,只是最近有點忙,所以被中斷了。下面我們就來看一下Response容器的相關知識吧。Response和我們即將在後面說到的Request容器是一一對應的,他是web容器在使用者每次請求服務端的

JavaWeb學習----自定義標籤&&JSTL標籤庫

今天來看一下自定義標籤的內容,自定義標籤是JavaWeb的一部分非常重要的核心功能,我們之前就說過,JSP規範說的很清楚,就是Jsp頁面中禁止編寫一行Java程式碼,就是最好不要有Java指令碼片段,下面就來看一下自定義標籤的簡介: 自定義標籤主要用於移除Jsp頁面中的ja

JavaWeb學習----HTTP協議

package com.http.demo; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import j

Nginx十八:Nginx深度學習Rewrite規則

src 開發 gin page return reload 技術 code 效果 Rewrite規則可以實現對url的重寫,以及重定向 作用場景: 1、URL訪問跳轉,支持開發設計,如頁面跳轉,兼容性支持,展示效果等 2、SEO優化 3、維護:後臺維護、流量轉

Nginx十九:Nginx深度學習進階高級模塊

cat max 地址 index 信息 access gin 切換 以及 這裏介紹一些最新或者理解起來有一些難度的Nginx模塊 一、secure_link_module模塊作用原理:1、制定並允許檢查請求的鏈接的真實性以及保護資源免遭未經授權的訪問2、限制鏈

Nginx二十一:Nginx深度學習配置蘋果要求的openssl後臺HTTPS服務

9.png 升級 ssl 版本升級 org tex 技術 就是 加密 配置蘋果要求的證書: 1、服務器所有的連接使用TLS1.2以上的版本(openssl 1.0.2) 2、HTTPS證書必須使用SHA256以上哈希算法簽名 3、HTTPS證書必須使用RSA20

網路學習基礎 計算機網路與Internet

網路學習之路之基礎詳解① 計算機網路概述之整體瞭解 首先我們理清總體思路,來看看計算機網路概述整體的框圖 從上圖我們可以大致瞭解到計算機網路包含內容,下面我們來對各方面進行詳細學習: (1)計算機網路VS Internet ①基礎理解: 計算機網路:一些互相連線的,自治的計算機的

tensorflow學習MultiRNNCell

tf.contrib.rnn.MultiRNNCell Aliases: Class tf.contrib.rnn.MultiRNNCell Class tf.nn.rnn_cell.MultiR

機器學習SVM

支援向量機簡介 支援向量機(SVM)是一種有監督的機器學習演算法,既可以用於分類,也可以用於迴歸。然而,它主要用於分類問題。在這個演算法中,我們將每個資料項繪製為n維空間中的一個點(其中n是您擁有的特徵數),每個特徵的值是特定座標的值。然後,我們通過找到區分這兩個類的超平面來執行分類(請看下

Nginx深入學習配置

A、正常執行的配置項 (1)Nginx worker程序執行的使用者及使用者組 語法: user username [groupname]; 預設: user nobody nobody;       user用於設定master程序啟動後,fork出的worker