出産前後の痔にはご注意!

ので教えてください。

アプリケーションコンテキストを得るために

struts2とspringが連携していない場合は

ApplicationContext appContext=new ClassPathXmlApplicationContext("ApplicationContext.xml");

の1行でできますが、
struts2とspringが連携している場合は

ActionContext context=ActionContext.getContext();
Map<?, ?> map=context.getContextMap();
ServletContext application=(ServletContext) map.get(StrutsStatics.SERVLET_CONTEXT);
WebApplicationContext appContext=(WebApplicationContext)
application.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

の長文の4行になります。
勿論この場合は最初の方法も使えます。
struts2とspringを連携しないほうがspringを簡単に使えるように思います。
設定ファイルの記述やプログラムコードが長くなるのにもかかわらず、
敢てstruts2とspringを連携するメリットを教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

struts2(画面)->spring2.5(Business Logic)->Hibernate(Data Access Object)


なだけですよね?
それぞれが依存性がないPOJOで作成することができるため、
単体テストにおいて、テスト対象モジュール以外が未作成でも
テスト可能というのが最大のメリットです。
単純に考えると、
Business Logicにて複数のエンティティを同時に更新することがなければあまり重要となることはないですが、
バージョンアップやポーティング対応で
struts2を他の画面系Frameworkに、
Hibernateを他のData Access Object Frameworkに差し替えた場合に、
他の部品をを修正する必要がないため、
工数が削減できると考えられます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
テストが簡単にできる
フレームワークやORマッピングの変更が用意になる
ということですね
フレームワークの変更は現実的でないと思いますが
開発規模が大きいとそれなりに大きくなりそうですね。

お礼日時:2009/05/31 16:22

>>敢てstruts2とspringを連携するメリットを教えてください。



システム開発は、開発をしていく途上で、またリリース後に仕様が変わることが多いと思います。このとき、「ちょっとした軽微な修正が1カ所発生した!」ということがよくあります。その影響が予想外に、玉突き的に多くのモジュールに影響することもよくあると思います。

そのとき、JavaやJspのソースを何本もメンテする必要が発生するよりも、最初は作るのが大変でも「1カ所の修正はしょうがないが、連携しているので他のソースを修正しないでもいい」となれば嬉しいのではないでしょうか?つまり開発中やその後のメンテが楽になる(かもしれない)というメリットを狙っているのではないでしょうか。

ただ、個人的な印象では、例にあげられた1行を長ったらしい5行に置き換える価値はあるのか?プログラマ的に損得勘定としてどうなの?(センス悪ーい!)とか、「連携しているから、1カ所で済む修正が、さまざまな多数のモジュールの修正を逆に呼び込んで大変になるのでは?」なーんてJavaの初心者は思ってしまいますけどね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
最初の環境設定、設定ファイル作成、初期のコードの記述
において多少導入が大変でも後は少し楽になり、メンテにも有利ということでしょうか。
大勢で開発しているや規模の大きいものを開発している場合は導入で苦労する人は一人であり苦労するのは開発期間からすればとるの足らないので
全体として導入コストはペイできるということですね。
逆にいえば
少人数、小規模でプログラミングする場合は連携するまでもないと言うことですね。
目的がSpring+Hibernateの機能でデータベースアクセスをDAOにより行うためだけならば連携をするまでもないですね。
有難うございました。

お礼日時:2009/05/30 22:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjava spring でエラーが出て困ってます

spring 超初心者です。cloudfoundyでcronを実行しようとしています。

CronService から@Autowiredで、StartJob_cを呼び出し
更に呼び出されたStartJob_cから、@AutowiredでReadFile_cを呼び出そうとしています。

しかし、Injection of autowired dependencies failed; nested exception
というエラーが出て動きません。

質問1)このような、呼び出しはできないのでしょうか?
質問2)springでこのような、呼び出しをしたい場合、どうするのが良いのでしょうか?




エラー内容は、
[ERROR] [main 11:08:03] (ContextLoader.java:initWebApplicationContext:220) Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cronService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.krams.tutorial.job.StartJob org.krams.tutorial.job.CronService.startJob; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'syncStartJob': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.krams.tutorial.job.ReadFile org.krams.tutorial.job.StartJob_c.readFile_cService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.krams.tutorial.job.ReadFile] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

です。


ロジックサンプルは、以下の通りです。

@Service
public class CronService implements Cron{

protected static Logger logger = Logger.getLogger("service");

@Autowired
@Qualifier("syncStartJob")
private StartJob startJob;

@Scheduled(cron="*/10 * * * * ?")
public void doSchedule() {
logger.debug("cron");
startJob.jobExec();

}
}




@Component("syncStartJob")
public class StartJob_c implements StartJob{
protected static Logger logger = Logger.getLogger("service");

//@Autowired
//private StartJob2 startJob2_cService;

@Autowired
private ReadFile readFile_cService;
@Autowired
private DeleteFile deleteFile_cService;
@Autowired
private ShinchokuFile1LineDel shinchokuFile1LineDel_cService;

public void jobExec() {
// TODO Auto-generated method stub
logger.debug("StartJob");

List<String> strYMDStartArray = new ArrayList();
strYMDStartArray.add("20060701");//0 1
strYMDStartArray.add("20060501");//1 2
strYMDStartArray.add("20060301");//2 3
strYMDStartArray.add("20060101");//3 4
strYMDStartArray.add("20051101");//4 5
strYMDStartArray.add("20050901");//5 6

String strFileName = "";


List<Integer> AYMDCNTData = new ArrayList();
strFileName = "YMDCNT";
AYMDCNTData = this.readFile_cService.readIntData(strFileName);
int intYMDCNT = AYMDCNTData.size();



List<Integer> ACNTData = new ArrayList();
strFileName = "JobCNT";
ACNTData = this.readFile_cService.readIntData(strFileName);
int intJobCNT = ACNTData.size();




String strYMDStart = "";
String strYMDEnd = "";
int intYMDID = 0;
int intJobCounter = 11;
intJobCounter = intJobCounter + intJobCNT;

String sTrailJoken_start = "";
String sTrailJoken_end = "";
String sTrailGaku_start = "";
String sTrailGaku_end = "";

if( intJobCounter == 11){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "5000";
sTrailGaku_end = "5000";
}else if(intJobCounter == 12){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "10000";
sTrailGaku_end = "10000";
}else if(intJobCounter == 13){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "15000";
sTrailGaku_end = "15000";
}else if(intJobCounter == 14){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "20000";
sTrailGaku_end = "20000";
}

spring 超初心者です。cloudfoundyでcronを実行しようとしています。

CronService から@Autowiredで、StartJob_cを呼び出し
更に呼び出されたStartJob_cから、@AutowiredでReadFile_cを呼び出そうとしています。

しかし、Injection of autowired dependencies failed; nested exception
というエラーが出て動きません。

質問1)このような、呼び出しはできないのでしょうか?
質問2)springでこのような、呼び出しをしたい場合、どうするのが良いのでしょうか?




エラー内容は、
[ERROR] [main 11:08:03] ...続きを読む

Aベストアンサー

例外のログはこれだけじゃないですよね?

QOracleで「文字が無効です」のエラーが出ます

Oracleで「文字が無効です」のエラーが出ます

JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。
発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。
何が悪いのか見当がつきません。
お知恵をお貸しください。
ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。
また、Oracle初心者です。

環境
端末:WindowsXP
Oracle:10g Express Edition ※文字コードはAL32UTF8
IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

Aベストアンサー

Java内で生成したSQL文を見ないとなんとも言えないけど。

Javaでリテラル吐き出して編集してますかね?
select UserID, UserName from mstUser where UserID = '001'; みたいな。
条件によって 001 の部分を変化させるような。


だったらJavaでシングルクォートを吐き出すところを二重にしてみるとどうかな?
ダブルクォートでは無いよ。二重に書くことでシングルクォート一個と解釈されればOKのはず。

そうしておかないとSQL文全体を文字列で扱うんだろうから、シングルクォートの対応が崩れる。

つくりとしては以下のように作成。
select UserID, UserName from mstUser where UserID = ''001''; みたいな。

SQL文を文字列変数に格納するんだろうから
'select UserID, UserName from mstUser where UserID = ''001'';'

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

QSQL Server のキャラクターセット(内部文字コード)は何処で定義するのでしょうか?

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。
今回SQL Server2005 を使って簡単なシステムを構築する事になりました。
SQL Serverが扱う文字コートについて教えてください。
Oracleを使っていた時の経験としてDB内部のキャラクターセットと
クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。
きっとSQL Serverにおいても同じような事ではないかと思いここに質問させていただきます。
以下2点についてどなたかコメント願います。
1.(Oracleでいうキャラクターセット)はどこで定義するのでしょうか?
2.OracleでいうNLS_LANGに相当するものはあるのでしょうか?
 (ひょっとしたらマイクロソフト製品なのでサーバもクライアントもCP932固定なのでしょうか?)

根本的にはシステム構築する上で『極力文字化けに遭遇したくない』思い出このような質問をさせていただきました。
『文字化け』について注意点などありましたら合わせてコメントいただければ助かります。
以上よろしくお願いします。

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。
今回SQL Server2005 を使って簡単なシステムを構築する事になりました。
SQL Serverが扱う文字コートについて教えてください。
Oracleを使っていた時の経験としてDB内部のキャラクターセットと
クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。
きっとSQL Serverにおいても同じような事ではないかと思いここに質問...続きを読む

Aベストアンサー

Windowsのロケールの設定を日本語にした状態でSQLServerをインストールした場合、cp932がデフォルトの照合順序になります。照合順序については参考URLをご覧下さい。

SQLServerではわかりませんが、PostgresではJDBCドライバ部分で変換していたように記憶しています。ODBCドライバではAutoTranslateという機能があります。

このため、ODBC接続で何も考えずにvarcharを使用するとcp932になります。

参考URL:http://www.microsoft.com/japan/msdn/sqlserver/sql2005/bb330962.aspx

Q別ファイルのfunctionの読み込み方

こんにちは
外部ファイル hello.js
-----------------------------
function aisatsu(){
var aa="hello"
}
-----------------------------
というファイルが存在した時にjikkou.htmlでaaの値、”hello”を呼び込みたい場合はどう記述すればよいのでしょうか?htmlのなかでaisatsu()をどこに記述していいのか分かりません。どうか教えてください。ただ、hello.jsのほうは実際の記述を簡略化したものであるのでそちらのほうはいじれません。

宜しくお願いします。

必要ないかもしれませんが、念のために私が最初に書いたhtmlの文です(もちろん実行できませんでした)
------------------------------------
<html>
<script language="javascript" src="hello.js">
aisatsu(){
document.write(aa);
}
</script></html>
------------------------------------

こんにちは
外部ファイル hello.js
-----------------------------
function aisatsu(){
var aa="hello"
}
-----------------------------
というファイルが存在した時にjikkou.htmlでaaの値、”hello”を呼び込みたい場合はどう記述すればよいのでしょうか?htmlのなかでaisatsu()をどこに記述していいのか分かりません。どうか教えてください。ただ、hello.jsのほうは実際の記述を簡略化したものであるのでそちらのほうはいじれません。

宜しくお願いします。

必要ないかもしれませんが、念のために...続きを読む

Aベストアンサー

function内で「var」をつけて変数を宣言するとfunction外からその変数の内容を取得することができなくなります。(returnで参照することはできます。)
なので変数の内容を取得する場合は「hello.js」の内容を

function aisatsu(){
var aa="hello";
return aa;
}

このように修正し、

<script language="javascript" src="hello.js"></script>
<script language="javascript">
var data=aisatsu();//「aisatsu()」関数の「aa」変数内のデータを引っ張り出す(return aa;)
document.write(data);//書いたり
alert(data);//アラートしたり
window.status=data;//ステータスバーに表示したり・・
</script>

Qhtmlでテーブル内にテキストボックスを作りたいのですが・・・

教えてください。

2行のテーブルを作ろうとしています。
1行目が項目で
2行目が入力できるようにしたいです。

入力できるようにしたいので
テーブル内にテキストボックスを作ったのですが
どうしてもテーブルを作る囲い線と
テキストボックスの右側の間に余白ができてしまいます。

テキストボックスの下にできる余白は
<form>
<table>
</table>
</form>
という感じで、テーブルをフォームで囲むことで
無くすことができました。

HTMLでこの余白を消せる方法がありましたら
ぜひ、教えてください。
よろしくお願いしますm(__)m

Aベストアンサー

ANo.1です。
「1行目が項目で2行目が入力」という事は、tableの構成は正しくはこうでしたね。

(省略)
<tr>
<th>項目名</th>
</tr>
<tr>
<td><input type="text" size="50" maxlength="100" name="hoge01" value=""></td>
</tr>
(省略)

失礼しました。でも、この結果でも同じですよ。

ただし…仮に、「項目名」に相当するデータのボリュームが、2行目の入力フィールドの長さより相対的に長くなってしまえば、当然余白はできますが。
そういう問題ではないですよね?

QStruts2のifタグについて

いつもお世話になっております。

現在Struts2の学習を行っているのですが、
iteratorでlistの中のmapの値を取得しているのですが、
データを表示させるか判定に使用するifのタグの条件に
propertyタグで取得した値を使用としたら、
正しく判定されませんでした。
どうしたらifタグのtest属性内でpropertyタグを使用できるでしょうか?

<table>
<s:iterator id="categoryList" value="categoryList" status="rowstatus" >
<s:property value="CATEGORYNAME"/>
<table border="3">
<s:iterator id="categoryTopicList" value="categoryTopicList" status="rowstatus" >
<s:if test='<s:property value="TCID"/> == <s:property value="CATEGORYID"/>'>
<tr>
<td><s:property value="CATEGORYID" /></td>
<td><s:property value="TCID" /></td>
<td><s:property value="TOPICNAME" /></td>
<td><s:property value="PROCEDURE"/></td>
</tr>
</s:if>
</s:iterator>
</table>
</s:iterator>

というようにjspは記述しています。
ifタグを使わずに表示させると値は取得されていたのでDBエラー等ではありませんでした。
使用しているstruts2のバージョンは2.0.14です。

ifタグにpropertyタグの値を条件として記述する方法を教えてください。
よろしくお願いします。

いつもお世話になっております。

現在Struts2の学習を行っているのですが、
iteratorでlistの中のmapの値を取得しているのですが、
データを表示させるか判定に使用するifのタグの条件に
propertyタグで取得した値を使用としたら、
正しく判定されませんでした。
どうしたらifタグのtest属性内でpropertyタグを使用できるでしょうか?

<table>
<s:iterator id="categoryList" value="categoryList" status="rowstatus" >
<s:property value="CATEGORYNAME"/>
<table border="3">
<s:iterator id="categoryTopic...続きを読む

Aベストアンサー

<s:if test="#categoryTopicList.TCID == #categoryTopicList.CATEGORYID">
でどうでしょう?
#categoryTopicListは、idに指定してある名前です。

ですから、
<s:iterator id="categoryTopic" value="categoryTopicList" status="rowstatus" >
とした場合は、
<s:if test="#categoryTopic.TCID == #categoryTopic.CATEGORYID">
になります。

Qの値をリストで取得したい

Struts2です。
リストの取得の仕方で困っています。

特定の条件で検索をかけ、jspに表示された結果を一部textfieldで<s:iterator>のリスト表示し、その中身を変更して更新ボタンを押すと、DBのデータを更新する、という流れです。

jspは以下のようになっています。(一部抜粋)

<table border="1">
<s:iterator status="st" value="projectList">
<tr>
<td><s:checkbox id="isChecked" name="isChecked" /></td>
<td><s:property value="projno"/></td>
<td><s:textfield id="projname" name="projname" maxlength="24" size="52" /></td>
<td><s:select id="deptno" name="deptno" list="departmentList" value="%{deptno}" listKey="deptno" listValue="deptno" /></td>
<td><s:textfield id="respemp" name="respemp" maxlength="6" size="12" /></td>
<td><s:textfield id="prstaff" name="prstaff" maxlength="6" size="12" /></td>
<td><s:textfield id="prstdate" name="prstdate" maxlength="8" size="12" /></td>
<td><s:textfield id="prendate" name="prendate" maxlength="8" size="12" /></td>
<td><s:textfield id="majproj" name="majproj" maxlength="6" size="12" /></td>
</tr>
</s:iterator>
</table>
<s:property value="listSize"/>件
<s:form >
<table>
<tr>
<td><s:textfield label="プロジェクトNo" id="projno" name="projno" size="8" maxlength="6" /></td>
</tr>
</table>
<table>
<tr>
<s:submit action="search103R" value="一覧検索" onclick="return search_fnc()" />
<s:submit action="modify103R" value="一覧更新" onclick="return modify_fnc()" />
<s:submit action="jumpStruts2" method="jump103R3" value="登録画面" />
<s:property value="replyMsg" />
<s:hidden value="%{projno}" />
</tr>
<s:actionerror />
</table>
</s:form>

javaのロジックは、以下のようになっています。引数に入れられた項目で更新する、という処理です。

// 更新処理
public void modify(String projno, String projname, String deptno, String respemp, String prstaff, String prstdate, String prendate, String majproj) throws SQLException, IOException {
// SQLプロパティファイル読み込み
sqlConf = DevLearningUtils.loadProperties("sql");
// SQL文
    UPDATE PROJECT SET PROJNAME = ?, DEPTNO = ?, RESPEMP = ?, PRSTAFF = ?, PRSTDATE = ?, PRENDATE = ?, MAJPROJ = ? WHERE PROJNO = ?

// 更新のSQL文を読み込む
statement = conn.prepareStatement(sqlConf.getProperty("ProjectModify"));

// 更新項目をSQL文にセット
statement.setString(1, projname);
statement.setString(2, deptno);
statement.setString(3, respemp);
// プロジェクト工数が空なら0を入れる
if (prstaff.length() == 0) {
statement.setString(4, "0");
} else {
statement.setString(4, prstaff);
}
statement.setString(5, FormatUtils.addHyphenToDate(prstdate));
statement.setString(6, FormatUtils.addHyphenToDate(prendate));
statement.setString(7, majproj);
statement.setString(8, projno);

statement.executeUpdate();
}

色々と調べてみたのですが、iteratorの内容をリストとしてjavaで取得する、という方法がわかりませんでした。ご教示お願いします。

Struts2です。
リストの取得の仕方で困っています。

特定の条件で検索をかけ、jspに表示された結果を一部textfieldで<s:iterator>のリスト表示し、その中身を変更して更新ボタンを押すと、DBのデータを更新する、という流れです。

jspは以下のようになっています。(一部抜粋)

<table border="1">
<s:iterator status="st" value="projectList">
<tr>
<td><s:checkbox id="isChecked" name="isChecked" /></td>
<td><s:property value="projno"/></td>
<td><s:textfield id="projname" name="projname" maxl...続きを読む

Aベストアンサー

nameが
projectList[0].projname
といった具合になるように生成してあげれば、
projectListの0番目の要素のprojnameに値をセットしてくれます。

具体的には
<s:iterator status="st" value="projectList">
<s:textfield name="projectList[%{#st.index}].projname" value="%{projname}" />
とします。

Qどこからも呼ばれていない無意味なクラスを抽出したい

Windows、Java7、Eclipseの環境で開発をしております。

とある膨大なパッケージ、クラスを持つプロジェクトがあるのですが、
管理が届かずに参照切れを起こし、不要となっているpublicなクラスがちらほらあります。

これを全て抽出したいのですが、
プロジェクト内でどこからも参照されないクラスを全て抽出する方法はあるでしょうか?

Aベストアンサー

ソースコードを解析するツールにて、使用していない箇所を報告してくれる機能があります。
Eclipse のプラグイン形式で使えるものならば、以下がそのものズバリでした。
http://www.ucdetector.org/
Eclipse Marketplace から導入できる様です。

プロジェクト単位で "detect unnecessary code" を実行すれば、
使用されていないクラスやメンバの一覧を表示してくれます。

ただし、ソースコードだけでは単純なクラス呼び出ししか解析できないので、
以下の様な事情があっても考慮されませんのでご注意ください。

* アプリケーションの入り口 (例: main 関数があるクラス)
* リフレクション経由でクラスを読み込む
* プロジェクト外から呼び出されるクラスがある
* 依存性の注入(DI)という概念で制御されている
* ミドルウェア製品から呼び出される (例: HttpServlet)


人気Q&Aランキング