http://grails.org/doc/latest/guide/theWebLayer.html#uploadingFiles
リファレンスのようにこんな感じで実装すればうまく動作した。
GSPに以下のようなタグを記述する。
Controllerを以下のように実装する。
Upload Form: <br />
<g:uploadForm action="upload">
<input type="file" name="myFile" />
<input type="submit" />
</g:uploadForm>
def upload() {
def f = request.getFile('myFile')
if (f.empty) {
flash.message = 'file cannot be empty'
render(view: 'uploadForm')
return
}
f.transferTo(new File('/some/local/dir/myfile.txt'))
response.sendError(200, 'Done')
}
// log4j configuration
log4j = {
// Example of changing the log pattern for the default console
// appender:
//
//appenders {
// console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
//}
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages' // GSP,
'org.codehaus.groovy.grails.web.sitemesh', // layouts
'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
'org.codehaus.groovy.grails.web.mapping', // URL mapping
'org.codehaus.groovy.grails.commons', // core / classloading
'org.codehaus.groovy.grails.plugins', // plugins
'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
'org.springframework',
'org.hibernate',
'net.sf.ehcache.hibernate'
}
[class jp.co.wave.dsam.Test]クラスのプロパティ[name]の空白は許可されません。これだとユーザーに全然優しくないので、分かりやすいメッセージに変更する方法を照会します。
| 項目 | 内容 |
|---|---|
| OS | Mac OS X 10.06 |
| Grails | 2.0.4 |
If a constraint is violated Grails will by convention look for a message code of the form: [Class Name].[Property Name].[Constraint Code] In the case of the blank constraint this would be user.login.blank so you would need a message such as the following in your grails-app/i18n/messages.properties file: user.login.blank=Your login name must be specified! The class name is looked for both with and without a package, with the packaged version taking precedence. So for example, com.mycompany.myapp.User.login.blank will be used before user.login.blank. This allows for cases where your domain class message codes clash with a plugin's. For a reference on what codes are for which constraints refer to the reference guide for each constraint.Googleで翻訳してみますと、
制約が違反している場合は、Grailsは慣例により、フォームのメッセージコードを探します。 [Class Name].[Property Name].[Constraint Code] このようなあなたのgrails-app/i18n/messages.propertiesファイルに次のようなメッセージが必要になりますので、空白の制約の場合、これはuser.login.blank次のようになります。 user.login.blank=Your login name must be specified! クラス名が優先してパッケージ化されたバージョンでは、とと、パッケージなしの両方で検索されます。したがって、たとえば、com.mycompany.myapp.User.login.blankはuser.login.blank前に使用されます。これは、ドメインクラスのメッセージコードは、プラグインのと衝突例が可能になります。 制約は、それぞれの制約のためにリファレンスガイドを参照しているコードが何であるかに参考のため。これを自分なりに読み解きますと、
validationでエラーが発生すると、 grails-app/i18n/messages.propertiesから、 [Class Name].[Property Name].[Constraint Code] という形式のメッセージコードを探します。 独自に定義することにより、プラグインで表示するメッセージとと異なるメッセージを出力することができます。試しにやってみると、追加したメッセージが出力されることを確認しました。
| 項目 | 内容 |
|---|---|
| OS | Mac OS X Lion |
| 項目 | 内容 |
|---|---|
| OS | Mac OS X Lion |
| POI | 3.8 |
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.Workbook
class ChangeSheetName {
publicstaticvoid main(String[] args) {
File file = new File('test.xls')
file.withInputStream {
Workbook wb = new HSSFWorkbook(it)
// 0番目のシートの名前を変更する
wb.setSheetName(0, 'シート名を変更した')
// 複製した結果を元ファイルに書き込む
file.withOutputStream {
wb.write(it)
}
}
}
}
| 項目 | 内容 |
|---|---|
| OS | Mac OS X Lion |
| POI | 3.8 |
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.Workbook
class CloneSheet {
publicstaticvoid main(String[] args) {
File file = new File('test.xls')
file.withInputStream {
Workbook wb = new HSSFWorkbook(it)
// 0番目のシートを複製する
wb.cloneSheet(0)
// 複製した結果を元ファイルに書き込む
file.withOutputStream {
wb.write(it)
}
}
}
}
| 項目 | 内容 |
|---|---|
| OS | Mac OS X Lion |
| Java | Java SE 7 (MacOS X Default) |
| eclipse | Eclipse Indigo(3.7) |
| Tomcat | Tomcat6 |
| GroupSession | 4.0.3(訳あって最新版ではないです) |
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.Workbook
class AddNewSheet {
public static void main(String[] args) {
new File('test.xls').withInputStream {
Workbook wb = new HSSFWorkbook(it)
// シートを5つ追加する
(0..<5).each {
wb.createSheet()
}
wb.createSheet('てすと')
}
}
}
package jp.co.indoor.test;
import org.dbunit.Assertion;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import groovy.sql.Sql;
import groovy.util.GroovyTestCase;
import groovy.xml.StreamingMarkupBuilder;
class DbUnitSampleTest extends GroovyTestCase {
static {
Sql.newInstance('jdbc:mysql://localhost:3306/test', '', '', 'com.mysql.jdbc.Driver').executeUpdate('delete from emp')
// .execute(
// """
// CREATE TABLE emp (
// empno INTEGER PRIMARY KEY,
// ename VARCHAR(10),
// job VARCHAR(9)
// );
// """)
}
JdbcDatabaseTester tester
void setUp() {
tester = new JdbcDatabaseTester('com.mysql.jdbc.Driver', 'jdbc:mysql://localhost:3306/test', '', '')
}
void test() {
tester.dataSet = dataSet {
emp empno:7369, ename:'SMITH', job:'CLERK'
emp empno:7499, ename:'ALLEN', job:'SALESMAN'
emp empno:7521, ename:'WARD', job:'SALESMAN'
}
tester.onSetup()
assert 1 == Sql.newInstance('jdbc:mysql://localhost:3306/test', '', '', 'com.mysql.jdbc.Driver').executeUpdate('delete from emp where empno = 7499')
Assertion.assertEquals dataSet {
emp empno:7369, ename:'SMITH', job:'CLERK'
emp empno:7521, ename:'WARD', job:'SALESMAN'
}, tester.connection.createDataSet()
}
def dataSet(c) {
new FlatXmlDataSet(new StringReader(new StreamingMarkupBuilder().bind{dataset c}.toString()))
}
}
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
class ReadWorkbook {
public static void main(String[] args) {
new File('test.xls').withInputStream {
Workbook wb = new HSSFWorkbook(it)
println wb.getSheetName(0) // 読み込めたかどうか、確認するためコンソールにシート名を出力しています
}
}
}
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
class StartUp {
/**
* エントリーポイント
* @param args
*/
public static void main(String[] args) {
// WORKBOOKを作成する
Workbook workbook = new HSSFWorkbook()
// シートを作成する
Sheet sheet = workbook.createSheet()
// WORKBOOKを保存する
FileOutputStream out = new FileOutputStream("test.xls")
workbook.write(out)
out.close()
}
}
private void tbl_listPropertyChange(java.beans.PropertyChangeEvent evt) {
int row = tbl_list.getSelectedRow();
if (row != -1) {
for (int col = 1; col < tbl_list.getColumnCount(); col++) {
Object val = tbl_list.getValueAt(row, col); // (1)
TableCellEditor editor = tbl_list.getCellEditor(row, col); // (2)
Component comp = editor.getTableCellEditorComponent(tbl_list, val, true, row, col); // (3)
comp.setEnabled(!machineList.get(row).getDeleteFlag()); // (4)
}
}
}
private void tbl_listMouseClicked(java.awt.event.MouseEvent evt) {
int row = tbl_list.rowAtPoint(evt.getPoint());
int col = tbl_list.columnAtPoint(evt.getPoint());
tbl_list.changeSelection(row, col, false, false); // 5)
}
1)セルに設定されている値を取得する。