Strutsにおける静的動的ActionFormの使用(一)
8825 ワード
目次
ログイン例
区別する
時間のプロパティ
検証メカニズム
Struts 1では、ActionFormが静的ActionFormであることによく接触します.静的とは,開発者がstrutsフレームワークを使用する際に対応するActionFormを書かなければならないことである.
動的ActionFormの使用を紹介する前に、strutsでよく使われるActionFormの方法を思い出して比較します.
完全なログイン例を挙げます.
第一:webを構成する.xml
第二:新しいjspページ(loginフォルダ)
第三:新規ActionForm
第四:新規アクション
第五:strutsコアプロファイルstruts-configを構成する.xml
以上の一般的な方法を使用すると、フォームごとにActionFormをほぼ作成するのが最大のトラブルです.ActionFormの数が多くなります.
動的ActionFormを使用すると、フォームごとに手動でActionFormを作成する必要がないという最大の利点があります.
動的ActionFormを使用する方法:
上記の第1ステップ、第2ステップは変更されず、第3ステップはキャンセルされ、第4ステップ、第5ステップが変更されます.
皆さんに理解してもらうために、まず5つ目のステップを修正します.
ステップ5ではform-propertyを使用してフォームのプロパティを指定します.ラベル内のnameはフォームjspのコントロールname値であり、両方が同じである必要があります.typeとは、コントロール値のタイプです.
手順4を変更します.
静的ActionForm方式はget/set方式,動的ActionForm方式,mapのget key方式を用いる.その中のkeyはラベルname値です.
動的ActionFormを使用するもう1つの利点は、フォームとActionFormを変更する場合、再配置する必要がないことです.静的ActionFormを使用する場合、ActionFormを修正する必要がある.JAvaファイルは、再配置する必要があります.
しかし、ダイナミックActionFormを使用すると、プロファイルが長すぎます.静的ActionFormほどはっきりしていない.
時間属性の使用
動的ActionForm使用時間タイプ
第1の方法:javaを使用する.sql.Dateタイプ.しかし、インタフェースはyyyy-MM-ddという形式でなければならない.
2つ目の方法:Stringタイプを使用します.でも楽屋で自分で切り替えます.
静的ActionForm使用時間タイプ
ActionFormには、自分でマッチングし、検証する機能があります.フォーム上のデータを自動的にActionForm対応のデータ型に変換します.しかしデフォルトのjava.sql.Dateタイプですがjavaです.util.Dateタイプは自動変換できません.
だからjavaを使うために.util.Dateタイプは、時間変換クラスを手動で開発し、フレームワークに注入します.
変換クラスで定義されるフォーマット、インタフェースで入力されるフォーマット.以上のように、yyyy/MM/ddインタフェース入力1988/10/11を定義する.1988-10-11フォーマットを入力すると、変換エラーが表示されます.変換クラスでは、yyyy-MM-dd形式を定義できます.
プロファイルでservletを構成する
ps:時間属性や時間変換器を含むdemoがアップロードされたdemo、静的actionformにログインします.ダウンロードする
ログイン例
区別する
時間のプロパティ
検証メカニズム
Struts 1では、ActionFormが静的ActionFormであることによく接触します.静的とは,開発者がstrutsフレームワークを使用する際に対応するActionFormを書かなければならないことである.
動的ActionFormの使用を紹介する前に、strutsでよく使われるActionFormの方法を思い出して比較します.
完全なログイン例を挙げます.
第一:webを構成する.xml
<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>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
第二:新しいjspページ(loginフォルダ)
<form action="../login.do" method="get">
: <input name="username" type="text"><br>
: <input name="password" type="text"><br>
<input type="submit" >
</form>
第三:新規ActionForm
package com.login;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
public class LoginForm extends ActionForm{
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;
}
private String username;
private String password;
}
第四:新規アクション
package com.login;
import java.util.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 LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
LoginForm loginForm=(LoginForm)form;
boolean flag=false;
if("admin".equals(loginForm.getUsername())&&"admin".equals(loginForm.getPassword())){
flag=true;
}
request.setAttribute("username",loginForm.getUsername());
if(flag)
{
return mapping.findForward("success");
}else{
return mapping.findForward("false");
}
}
}
第五: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://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<!-- form -->
<form-beans>
<form-bean name="loginForm" type="com.login.LoginForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login" type="com.login.LoginAction" name="loginForm"
scope="request">
<forward name="success" path="/login/success.jsp"></forward>
<forward name="false" path="/login/false.jsp"></forward>
</action>
</action-mappings>
</struts-config>
以上の一般的な方法を使用すると、フォームごとにActionFormをほぼ作成するのが最大のトラブルです.ActionFormの数が多くなります.
動的ActionFormを使用すると、フォームごとに手動でActionFormを作成する必要がないという最大の利点があります.
動的ActionFormを使用する方法:
上記の第1ステップ、第2ステップは変更されず、第3ステップはキャンセルされ、第4ステップ、第5ステップが変更されます.
皆さんに理解してもらうために、まず5つ目のステップを修正します.
<!-- form -->
<form-beans>
<form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"></form-property>
<form-property name="password" type="java.lang.String"></form-property>
</form-bean>
</form-beans>
ステップ5ではform-propertyを使用してフォームのプロパティを指定します.ラベル内のnameはフォームjspのコントロールname値であり、両方が同じである必要があります.typeとは、コントロール値のタイプです.
手順4を変更します.
package com.login;
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 LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
DynaActionForm loginForm=(DynaActionForm)form;
String username=(String)loginForm.get("username");
String password=(String)loginForm.get("password");
boolean flag=false;
if("admin".equals(username)&&"admin".equals(password)){
flag=true;
}
request.setAttribute("username",username);
if(flag)
{
return mapping.findForward("success");
}else
{
return mapping.findForward("false");
}
}
}
静的ActionForm方式はget/set方式,動的ActionForm方式,mapのget key方式を用いる.その中のkeyはラベルname値です.
動的ActionFormを使用するもう1つの利点は、フォームとActionFormを変更する場合、再配置する必要がないことです.静的ActionFormを使用する場合、ActionFormを修正する必要がある.JAvaファイルは、再配置する必要があります.
しかし、ダイナミックActionFormを使用すると、プロファイルが長すぎます.静的ActionFormほどはっきりしていない.
時間属性の使用
動的ActionForm使用時間タイプ
第1の方法:javaを使用する.sql.Dateタイプ.しかし、インタフェースはyyyy-MM-ddという形式でなければならない.
2つ目の方法:Stringタイプを使用します.でも楽屋で自分で切り替えます.
静的ActionForm使用時間タイプ
ActionFormには、自分でマッチングし、検証する機能があります.フォーム上のデータを自動的にActionForm対応のデータ型に変換します.しかしデフォルトのjava.sql.Dateタイプですがjavaです.util.Dateタイプは自動変換できません.
だからjavaを使うために.util.Dateタイプは、時間変換クラスを手動で開発し、フレームワークに注入します.
package com.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
public class UtilDateConvert implements Converter {
@Override
public Object convert(Class type, Object value) {
if(value==null){
return value;
}
if(value instanceof Date){
return value;
}
Date dateConvert=null;
if(value instanceof String){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
try {
dateConvert =(Date)sdf.parse((String)value);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return dateConvert;
}
}
変換クラスで定義されるフォーマット、インタフェースで入力されるフォーマット.以上のように、yyyy/MM/ddインタフェース入力1988/10/11を定義する.1988-10-11フォーマットを入力すると、変換エラーが表示されます.変換クラスでは、yyyy-MM-dd形式を定義できます.
package com.util;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.beanutils.ConvertUtils;
public class UtilDateServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
ConvertUtils.register(new UtilDateConvert(), Date.class);
}
}
プロファイルでservletを構成する
<servlet>
<servlet-name>dateConvert</servlet-name>
<servlet-class>com.util.UtilDateServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
ps:時間属性や時間変換器を含むdemoがアップロードされたdemo、静的actionformにログインします.ダウンロードする