2017-03-23 1 views
2

반복 가능한 코드를 자주 작성해야합니다. (..., 그것은 가장 좋은 예를하지 않을 수 있지만,하지만 난 당신이 일반적인 아이디어를 얻을 희망)반복 가능한 코드 생성

Java에서 다음 예를 살펴

String X = rs.getString("X");

X 값이됩니다

: 'name'를, 'surname' ... 및 20 - 30 기타 값.

는 (또 다른 예는 HTML 코드와 다른 코드가 될 것이다 - 당신이 X 위해 작성해야합니다)

최종 결과가 있어야한다 : 여기

String name=rs.getString("name"); 
String surname=rs.getString("surname"); 
.... 

String whatever = rs.getString("whatever"); 

html 테이블과 약간의 또 다른 예이다 scriplets, <th>X</th><td><%=myBean.getX()%></td> 될 것이다 복제하는이 경우 문자열의 최종 결과는 다음과 같습니다

<table style="width:100%"> 
    <tr> 
    <th>name</th> 
    <th>surname</th> 
    <th>..</th> 
    <th>whatever</th> 
    </tr> 
<tr> 
    <td><%=myBean.getName()%></td> 
    <td><%=myBean.getSurname()%></td> 
    <td>..</td> 
    <td><%=myBean.getWhatever()%></td> 
    </tr> 
</table> 

위의 코드 복사 양식을 30 번 붙여 넣은 다음 편집하면이 문제를 해결할 수있는 '영리한'방법은 python, jinja2 라이브러리를 사용하고 작은 코드 생성기를 작성하는 것입니다.

그러나, 나는 text file에서 값을 읽은 다음 읽은 값에 대한 코드를 생성하는 사용자 정의 script을 만듭니다 template을 만들 라이브러리를 설치, python를 설치했다 그렇게하기 위해서이다.

이상을 달성하는 데 더 쉬운 방법이 있습니까?

코드 생성을 지원하는 모든 편집기 또는 플러그인은 무엇입니까? 나는 몇 줄을 다시 생성 할 등 getter 및 setter ... 같은,하지만 ... 충분히 간단히 말해서

, 하지 않습니다 -

나는 같은 넷빈즈 등의 IDE는 이클립스가 몇 가지 코드를 생성 할 수 있다는 사실을 알고 특정 부분만을 변경하여 코드를 수정하는 방법 ... 그 문제를 쉽게 해결하는 방법은 무엇입니까? (나는 이것을하는 어려운 방법을 안다.) 나는 아이디어를 찾고있다. ...

+0

이 질문은 무엇인가 더 구체적으로? – Justas

+0

모든 X 값을 목록 또는 배열에 저장하고 모든 값을 Map 에 저장합니다. – Compass

+0

코드 생성을 사용하는 대신 안전한 방법으로 이러한 작업을 처리하는 라이브러리가 있습니다. 데이터베이스 작업을위한 ORM 매퍼, 다른 것들을위한 다른 도구. – Kayaman

답변

0

아마도 존재하지 않는 것을 찾고 있습니다.

그래서 나는 내 질문에 묘사 한 내용을 달성하기 위해 내 '어려운 방법으로'을 게시 할 예정입니다. (누군가가 유용 할 수 있기를 바랍니다.)

여기에서는 자바, html, jsp, xsd 및 기타 코드를 생성하는 데 사용하는 작은 코드 생성기를 미리 설정합니다.

InputData.txt

:This is field list 
field1:field1 description 
field2:field2 description 
field3:field3 description 
field4:field4 description 
name:first name of the person 
surname:last name of the person 
whatever:whatever you need 

CodeGenerator.py

import jinja2 
import codecs 
templateLoader = jinja2.FileSystemLoader(searchpath=".") 
templateEnv = jinja2.Environment(loader=templateLoader) 
TEMPLATE_FILE = "CodeGenerator.jinja" 
template  = templateEnv.get_template(TEMPLATE_FILE) 
COLUMNS  = [tuple(line.split(':')) for line in codecs.open("InputData.txt", "r", "utf-8")] 
COLUMNS  = map(lambda s: (s[0],(s[0].strip().title(),s[1].strip())), COLUMNS) 
#title() copy of the string in which first characters of all the words are capitalized. 
#strip() copy of the string, all chars have been stripped from the beginning and the end 
#lambda s --> (field1,(Field1,field1 description)) 
#ignore the first line 
COLUMNS.pop(0) 
#add variables to work with 
templateVars = { "table" : "MyTableName", 
       "description" : "A simple code generator", 
       "columns" : COLUMNS 
       } 

outputText = template.render(templateVars) 
f = open('Generated.txt', 'w') 
outputText = outputText.encode('utf-8') 
f.write(outputText) 
f.close() 
print outputText 
,691 : 나는

내 파일 Python27Jinja2-2.7.2을 사용하고

CodeGenerator.jinja

//------------------model------------------------ 
//Generated code for model 
import java.io.Serializable; 
public class {{table|capitalize}}_Model implements Serializable{ 
{%for columnName,columnTitle in columns%} 
private String {{columnName|lower}};{%endfor%} 

{% for columnName,columnTitle in columns %} 
public void set{{columnName|capitalize}}(String {{columnName|lower}}){ 
    this.{{columnName|lower}}={{columnName|lower}}; 
} 
public String get{{columnName|capitalize}}(){ 
    return this.{{columnName|lower}}; 
} 
{% endfor %} 
public {{table|capitalize}}_Model({% for columnName,columnTitle in columns %}String {{columnName|lower}}{% if not loop.last %},{% endif %}{% endfor %}){ 
     {% for columnName,columnTitle in columns %} 
    this.{{columnName|lower}}={{columnName|lower}}; {% endfor %} 
    } 
public String toString(){ 

return {% for columnName,columnTitle in columns %}"{{columnName|lower}}:" + this.{{columnName|lower}}{% if not loop.last %}+{% endif %}{% endfor %}; 

} 

} 
//------------------model------------------------ 
//-----------------getStrings-------------------- 
{% for columnName,columnTitle in columns %} 
String {{columnName}}=rs.getString("{{columnName}}"); 
{% endfor %} 
//---------------------------------------------- 
//------------------jsp example----------------- 
{% for columnName,columnTitle in columns %} 
<s:label cssStyle ="margin-top:5px;color:blue;" value="{{columnTitle[1]}} :" id="{{columnName}}_label"/> 
<s:textfield label="{{columnTitle[1]}}" name="myBean.{{columnName}}" /> 
{% endfor %} 
//------------------jsp example----------------- 
0

IntelliJ에는 IntelliJ에서 코드의 일부를 생성하는 데 사용하는 "라이브 템플릿"기능이있다.

예를 들어 "sout"을 입력하면 IntelliJ는 "System.out.println"을 제안합니다.

당신이 "주"를 입력

당신은 아주 commom있는 코드의 조각을 위해 그런 일을 만들 수 있습니다 "공공 정적 무효 메인 (문자열 []에 args)", 이클립스 제안합니다.

1

이러한 시나리오에서 할 수있는 최선의 방법은 HashMap과 함께 상수 배열을 사용하는 것입니다. 상수 배열은 해시 맵의 키 이름을 보유하고 해시 맵은 각 해시 값을 보유합니다.예를 들어

:

String[] keys = {"name", "surname", "whatever" }; 
HashMap<String, String> elements = new HashMap<String, String>(); 
for (String key : keys) 
{ 
    elements.put(key, rs.getString(key)); 
} 

당신은 모든 요소가 같은 유형에서 것을 조심해야합니다. 그렇지 않은 경우 객체로 저장 한 다음 캐스트해야합니다.

편집 : 스크립틀릿에 사용하기위한 좋은 생각은 다음과 같습니다

내가 제대로 문제를 이해한다면
<tr> 
    <% for (String key : keys) 
     { 
    %>  
    <td><%= elements.get(key)%></td> 
    <% } %> 
</tr> 
0

, 당신은 열이 많은 ResultSet 있습니다. 그리고 당신은 그들을 하나씩 얻고 싶지 않습니다. ResultSet에서 다음과 같은 방법으로 모든 열을 얻을 수 있습니다 :

ResultSetMetaData metaData = resultSet.getMetaData(); 
for (int columnIndex = 1; columnIndex <= metaData.getColumnCount(); columnIndex++) { 
    String columnName = metaData.getColumnName(columnIndex); 
    String value = resultSet.getString(columnIndex); 
} 

부여 된 모든 값이 예에서 문자열로 표현됩니다,하지만 당신은 또한 같은를 사용하여 컬럼의 유형을 확인할 수 있습니다 metaData 개체입니다. 문서에서 자세한 내용을 읽어보십시오. https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html