2009년 6월 29일 월요일

filter 를 이용한 한글처리

--web.xml-------------------------------------------------------------------------

 

<web-app>
  <filter>
      <filter-name>encoder</filter-name>
      <filter-class>utils.hangle.EncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>euc-kr</param-value>
      </init-param>
  </filter>
  <filter-mapping>
   <filter-name>encoder</filter-name>
   <servlet-name>action</servlet-name>
  </filter-mapping>

</web-app>

 

--EncodingFilter.java---------------------------------------------------------------

 

package utils.hangle;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * EncodingFilter.java
 * @web:filter
 *      name = "encoder"
 * @web:filter-init-param
 *      name = "encoding"
 *      value = "euc-kr"
 * @web:filter-mapping
 *      url-pattern = "*.jsp"
 */
public class EncodingFilter implements Filter {

    private static Log log = LogFactory.getLog(EncodingFilter.class);

    private boolean enabled = true;
    private String encoding;

    /**
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    public void init(final FilterConfig config) throws ServletException {
        this.encoding = config.getInitParameter("encoding");

        if (log.isInfoEnabled()) {
            log.info("Encoding filter has been initialized : " + encoding);
        }
    }

    /**
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
     *           javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    public void doFilter(
            final ServletRequest request,
            final ServletResponse response,
            final FilterChain chain) throws IOException, ServletException {
        if (enabled && (encoding != null)) {
            try {
                request.setCharacterEncoding(encoding);
            } catch (UnsupportedEncodingException e) {
                if (log.isWarnEnabled()) {
                    log.warn("Encoding filter has been disabled.", e);
                }

                this.enabled = false;
            }
        }

        chain.doFilter(request, response);
    }

    /**
     * @see javax.servlet.Filter#destroy()
     */
    public void destroy() {
        if (log.isInfoEnabled()) {
            log.info("Encoding filter has been destoryed.");
        }
    }
}

 

3D 간단 구현

http://namsuck.cafe24.com/projects/3d/g3d.html

3D구현을 위해 한동안 만지던 소스이다..
버그도 있고 하지만...
나중에 개발자료로 쓰기 위해서 올려 두었다.. 실행시 클릭후... 방향키로 조정 할 수 있다

- 양 남 석 -
 

최단거리(미완성)

http://namsuck.cafe24.com/projects/theLeastDistance/theLeastDistance.html

Djikstra's algorithm (named after its discover, E.W. Dijkstra) solves the problem of finding the shortest path from a point in a graph (the source) to a destination. It turns out that one can find the shortest paths from a given source to all points in a graph in the same time, hence this problem is sometimes called the single-source shortest paths problem.


Djikstra's algorithm을 이용해 구현해 놓은 소스이다..
아직 UI나 예외처리가 부족하다             
-양 남 석-
 

slotmachine

http://namsuck.cafe24.com/projects/slotmachine/SlotMachineApplet.html

기본 알고리즘 까지만 구현해 놓은 소스이다..
            
-양 남 석-

장기 (미완성)

http://namsuck.cafe24.com/projects/janggi/janggi.html

기본 알고리즘 까지만 구현해 놓은 소스이다..
아직 승부 처리 및 여러가지가 필요하다.

이동경로 구현.

-양 남 석-

Othello (미완성)

http://namsuck.cafe24.com/projects/othello/othello.html

기본 알고리즘 까지만 구현해 놓은 소스이다..
아직 승부 처리 및 여러가지가 필요하다.
            
-양 남 석-


----othello.html------------------------------------------------------------------
<html>

<body>

<br>
<br>
<center>
<!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<object
    classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    codebase = "http://java.sun.com/update/1.6.0/jinstall-6u13-windows-i586.cab#Version=6,0,0,3"
    WIDTH="700" HEIGHT = "500" >
    <PARAM NAME = CODE VALUE = "Othello.class" >
    <PARAM NAME = "codebase" value = "projects/othello/" >
    <param name = "type" value = "application/x-java-applet;version=1.6">
    <param name = "scriptable" value = "false">

    <comment>
<embed
            type = "application/x-java-applet;version=1.6" \
            CODE = "Othello.class" \
            codebase = "projects/othello/" \
            WIDTH="700" HEIGHT = "500"
   scriptable = false
   pluginspage = "http://java.sun.com/products/plugin/index.html#download">
   <noembed>
            
            </noembed>
</embed>
    </comment>
</object>

</center>
</body>

</html>

----Othello.java------------------------------------------------------------------
import java.awt.*;
import java.applet.*;
import java.awt.Image;
import java.awt.event.*;


public class Othello extends Applet implements MouseListener
{

private static final long serialVersionUID = 9721014L;  

private Image           imgOffScr;                      
private Graphics        grpOffScr;  

int sizeH=40;
int sizeW=40;
int partition=8;

int mouseX=0;
int mouseY=0;
int number=1;
int data[][];

    public void init()
    {
        this.setBackground(Color.white);

data=new int[partition][partition];
for(int i=0;i<partition;i++)
for(int j=0;j<partition;j++)
data[i][j]=0;

addMouseListener(this);
    }
    
    public void start()
{
imgOffScr = createImage(getWidth(),getHeight());
        grpOffScr = imgOffScr.getGraphics();
}
public void update(Graphics g)
{
        paint(g);
}

public void paint(Graphics g)
    {
   grpOffScr.setColor(Color.white);            
        grpOffScr.fillRect(0, 0, getWidth(),getHeight());  

///////////////판에 무늬넣기/////////////////////////////////////////////////
for (int i=0;i<partition;i++)
{
for (int j=0;j<partition;j++)
{
if((i+j)%2==0)grpOffScr.setColor(new Color(200,200,200));
else grpOffScr.setColor(new Color(220,220,220));
grpOffScr.fillRect(i*sizeH,j*sizeW,sizeH,sizeW);
}
}

///////////////판에 줄그리기/////////////////////////////////////////////////
grpOffScr.setColor(Color.black);
for (int i=0;i<partition+1;i++ )              
{
grpOffScr.drawLine(0,i*sizeH, sizeH*partition,i*sizeW);    //세로줄
grpOffScr.drawLine(i*sizeW,0, i*sizeW,sizeH*partition);   //가로줄
}
///////////////바둑알그리기/////////////////////////////////////////////////
for(int i=0;i<partition;i++)                            
for(int j=0;j<partition;j++)
if(data[i][j]==1 || data[i][j]==2)
{
if(data[i][j]==1)grpOffScr.setColor(new Color(100,100,200));
else if(data[i][j]==2)grpOffScr.setColor(new Color(200,100,100));
grpOffScr.fillOval(i*sizeH+3,j*sizeW+3,sizeH-6,sizeW-6);  //속이 찬 원그리기
grpOffScr.setColor(Color.black);                                    
grpOffScr.drawOval(i*sizeH+3,j*sizeW+3,sizeH-6,sizeW-6);  //원 윤각테두리
}

///////////////상황창보이기/////////////////////////////////////////////////

if(number==1)grpOffScr.setColor(new Color(80,80,200));
else if(number==2)grpOffScr.setColor(new Color(200,80,80));
grpOffScr.fillOval(partition*sizeH+100,0,sizeH-6,sizeW-6);


grpOffScr.setColor(new Color(200,200,200));
grpOffScr.fillRect(partition*sizeH+20,10,60,30);
grpOffScr.setColor(Color.black);
grpOffScr.drawRect(partition*sizeH+20,10,60,30);
grpOffScr.drawString("다시",partition*sizeH+70,10);

grpOffScr.setColor(Color.black);
grpOffScr.drawString("박스크기X:"+Integer.toString(getHeight()),350,50);
grpOffScr.drawString("박스크기Y:"+Integer.toString(getWidth()),350,80);
grpOffScr.drawString("칸X:"+Integer.toString(mouseX),350,110);
grpOffScr.drawString("칸Y:"+Integer.toString(mouseY),350,140);
grpOffScr.drawString("파란돌수:"+Integer.toString(bluecount()),350,170);
grpOffScr.drawString("빨간돌수:"+Integer.toString(redcount()),350,200);
grpOffScr.drawString(win(),350,230);
///////////////버퍼에 있는 이미지 출력///////////////////////////////////////
g.drawImage(imgOffScr, 0, 0, this);    
    }



public void mousePressed(MouseEvent e)
{
if(e.getX()<=sizeW*partition && e.getY()<=sizeH*partition )
{
mouseX=(e.getX()/sizeH);
mouseY=(e.getY()/sizeW);
algorithm();
}
}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}

/*
    public void run()
    {
    }

    
    public void stop()
    {
    }

    public void destroy()
    {
    }
*/

public void change_Data(String d,int select)   //d는 좌표값이 들어있는 항상 XY짝수이다.
{
for(int i=0;i<d.length()/2;i++)  //좌표의 갯수
{
  data[Integer.parseInt(d.substring(i*2,i*2+1))][Integer.parseInt(d.substring(i*2+1,i*2+2))]=select;  //좌표를 저장
}
}


public int bluecount()
{
int count=0;
for(int i=0;i<partition;i++)
for(int j=0;j<partition;j++)
if(data[i][j]==1)count++;
return count;
}

public int redcount()
{
int count=0;
for(int i=0;i<partition;i++)
for(int j=0;j<partition;j++)
if(data[i][j]==2)count++;
return count;
}

public String win()
{
int countb=0;
int countr=0;

for(int i=0;i<partition;i++)
for(int j=0;j<partition;j++)
{
if(data[i][j]==1)countb++;
if(data[i][j]==2)countr++;
}
if(countb>countr)return "파란색이 많음";
else if(countb<countr)return "빨간색이 많음";
else return "파란색과 빨간색 갯수 같음";
}


public void algorithm()
{
if(data[mouseX][mouseY]==0)
{
//선택 3시쪽 돌 변경
String temp="";
for(int i=mouseX+1;i<partition && data[i][mouseY]!=0;i++)    
if(data[i][mouseY]!=number)temp+=Integer.toString(i)+Integer.toString(mouseY);
else{change_Data(temp,number);break;}
//선택 9시쪽 돌 변경
temp="";
for(int i=mouseX-1;i>=0 && data[i][mouseY]!=0;i--)    
if(data[i][mouseY]!=number)temp+=Integer.toString(i)+Integer.toString(mouseY);
else {change_Data(temp,number);break;}
//선택 12시쪽 돌 변경
temp="";
for(int i=mouseY-1;i>=0 && data[mouseX][i]!=0;i--)    
if(data[mouseX][i]!=number)temp+=Integer.toString(mouseX)+Integer.toString(i);
else {change_Data(temp,number);break;}
//선택 6시쪽 돌 변경
temp="";
for(int i=mouseY+1;i<partition && data[mouseX][i]!=0;i++)    
if(data[mouseX][i]!=number)temp+=Integer.toString(mouseX)+Integer.toString(i);
else {change_Data(temp,number);break;}
//선택 1시반쪽 돌 변경
temp="";
for(int i=mouseX+1,j=mouseY-1;i<partition && j>=0  && data[i][j]!=0;i++,j--)    
if(data[i][j]!=number)temp+=Integer.toString(i)+Integer.toString(j);
else {change_Data(temp,number);break;}
//선택 7시반쪽 돌 변경
temp="";
for(int i=mouseX-1,j=mouseY+1;i>=0 && j<partition  && data[i][j]!=0;i--,j++)    
if(data[i][j]!=number)temp+=Integer.toString(i)+Integer.toString(j);
else {change_Data(temp,number);break;}
//선택 4시반쪽 돌 변경
temp="";
for(int i=mouseX+1,j=mouseY+1;i<partition && j<partition  && data[i][j]!=0;i++,j++)    
if(data[i][j]!=number)temp+=Integer.toString(i)+Integer.toString(j);
else {change_Data(temp,number);break;}
//선택 11시반쪽 돌 변경
temp="";
for(int i=mouseX-1,j=mouseY-1;i>=0 && j>=0  && data[i][j]!=0;i--,j--)    
if(data[i][j]!=number)temp+=Integer.toString(i)+Integer.toString(j);
else {change_Data(temp,number);break;}



// 선택한 돌 놓고... 차례 바꾸기
if(number==1)
{
data[mouseX][mouseY]=1;
number=2;
}
else  if(number==2)
{
data[mouseX][mouseY]=2;
number=1;
}

// 화면 다시 그리기
repaint();
}
}

}

zipcode

이미지 스핀....

import java.awt.*;
import java.awt.image.*;
import java.net.URL;

import javax.swing.ImageIcon;

public class ImageHandle {
//---이미지 불려오기 JAR로 압축후 내부파일에 접근할수 있도록
public static ImageIcon loadImageIcon(Object ob,String ref) // this,파일명
{
URL url=ob.getClass().getClassLoader().getResource(ref);
       return new ImageIcon(url);
}
public static BufferedImage loadImage(Object ob,String ref) {   // this,파일명
        BufferedImage bimg = null;  
        try {  
         URL url=ob.getClass().getClassLoader().getResource(ref);
         ImageIcon temp=new ImageIcon(url);
         bimg=imageToBufferedImage(temp);
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return bimg;  
    }  

//--- 이미지를 버퍼이미지로------------------------------------------
public static BufferedImage imageToBufferedImage(ImageIcon temp1) {
Image temp2=temp1.getImage();
BufferedImage copy = new BufferedImage(temp1.getIconWidth(),temp1.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = copy.createGraphics();
        g.drawImage(temp2, 0, 0, null);
        g.dispose();
        return copy;
    }

//---이미지 돌리기-----------------------------------------------------
public static BufferedImage rollImage(BufferedImage img[],int w,int h, int cols)
{
// 스트롤 방향은.. 아래로... 첫번째 이미지가 제일 아래로..
int time=cols%(img.length*h);  //여러바퀴 돌아을때 를 생각해서  
        int img1=time/w;  // 아래부분 이미지
        int img2=img1+1;  // 아래부분 이미지
        if(img2==img.length)img2=0;
        
        BufferedImage imgs = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);  // 이미지 생성
        Graphics2D g = imgs.createGraphics();  
        
        g.drawImage(img[img2],0,time%h-h,w,h,null);   //윗쪽 이미지 그림
        g.drawImage(img[img1],0,time%h,h,h,null); //아래쪽 이미지 그림
        g.dispose();  

        return imgs;
}
// 이미지의 윗부분과 아래부분을 어둡게 하기 위해서...
public static BufferedImage alphaImage(BufferedImage img)
{
        Graphics2D g = img.createGraphics();            
        int w = img.getWidth();
     int h = img.getWidth();

        BufferedImage img1 = new BufferedImage(w,h/5, BufferedImage.TYPE_INT_ARGB);  // 윗쪽 그림자를 위해
        Graphics2D g1 = img1.createGraphics();  

        BufferedImage img2 = new BufferedImage(w,h/5, BufferedImage.TYPE_INT_ARGB);  // 아래쪽 그림자를 위해
        Graphics2D g2 = img2.createGraphics();  

        
        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC);  
        ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f);


        g1.setComposite(ac);
        g1.setPaint(new GradientPaint(w/2,0, Color.black,w/2,img1.getHeight(),Color.white));
        g1.fillRect(0,0,w,img1.getHeight());
        g.drawImage(img1,0,0,w,img1.getHeight(),null);

        g2.setComposite(ac);
        g2.setPaint(new GradientPaint(w/2,0,Color.white,w/2,img2.getHeight(), Color.black));
        g2.fillRect(0,0,w,img2.getHeight());
        g.drawImage(img2,0,img2.getHeight()*4,w,img2.getHeight(),null);
        
        return img;
}
// 이미지의 테두리 그리기(검정색으로)
public static BufferedImage outlineImage(BufferedImage img)
{
        Graphics2D g = img.createGraphics();            
        int w = img.getWidth();
     int h = img.getWidth();

        BufferedImage imgT = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);  
        Graphics2D g1 = imgT.createGraphics();  
        g1.setColor(Color.black);
        g1.drawRect(0,0,w-1,h-1);
        g.drawImage(imgT,0,0,null);
        return img;
}

// 이미지의 테두리 그리기(검정색으로)
public static BufferedImage inlineImage(BufferedImage img,int dep)
{
        Graphics2D g = img.createGraphics();            
        int w = img.getWidth();
     int h = img.getWidth();

        BufferedImage imgT = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g1 = imgT.createGraphics();  
        for(int i=dep;i>0;i--)
        {
         if(i==dep)g1.setColor(new Color(100,50,50));
         else g1.setColor(new Color(250,170,100));    
            g1.drawRect(i,i,w-i*2,h-i*2);
        }
        
        g.drawImage(imgT,0,0,null);
        return img;
}

}

mid 파일 간단 실행 예제...

package slotMachine.util;

import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;

public class AudioPlayer
{

AudioClip gold;
public AudioPlayer()
{
URL url=this.getClass().getClassLoader().getResource("bulblestart.mid");
gold = Applet.newAudioClip(url);
}
public void play()
{
gold.play();
}

public void stop()
{
gold.stop();
}

}

for( : ) //jdk1.5이상

for(int s : nu)System.out.println(s);

예)
nu배열에 있는 값을 하나씩 꺼내서 s에 집어 넣는다.

InputStreamReader 이용 DOS 창에서 입력

1)
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
int number;
char oc;

System.out.print("\nNumber :");
number=Integer.parseInt(br.readLine());

2)
System.out.print("다시할까요(Y/y) :");
oc=(char)System.in.read();
System.in.read(); //   /n 제거
System.in.read(); //   /t 제거




1)은 문자열... 2)는 한개의 char를 받을때

System.out.printf( ,변수명)

System.out.printf("%.2f",test);

test라는 변수를 소수점 2번째까지 표시

java.util.Random

class RandomEx
{
public static void main(String[] args)
{
java.util.Random rd=new java.util.Random();

int nu1=rd.nextInt(101);
int nu2=rd.nextInt(51)+50;

System.out.println("num: "+nu1);
System.out.println("num: "+nu2);
}
}

import java.util.Scanner;

import java.util.Scanner;


public class ScannerEx {

public static void main(String[] args) {
String name;
int age;
double tall;

Scanner sc = new Scanner(System.in);

System.out.print("name:"); name=sc.next();
System.out.print("age:"); age=sc.nextInt();
System.out.print("tall:"); tall=sc.nextDouble();
System.out.println(name+"    "+age+"    "+tall);
}
}

파일입출력-일본어

if (e.getSource() == save) {
// 일본어 SJIS    
try {
FileOutputStream fo=new FileOutputStream("out.txt");
OutputStreamWriter ow=new OutputStreamWriter(fo,"Shift_JIS");
BufferedWriter fw = new BufferedWriter(ow);
fw.write(out.getText());
fw.close();

JOptionPane.showMessageDialog(this, out.getText() + "저장되었습니다.");
} catch (IOException e1) {
e1.printStackTrace();
}

}

if (e.getSource() == load) {
try {
FileInputStream fi= new FileInputStream("out.txt");
InputStreamReader in = new InputStreamReader(fi, "Shift_JIS");
BufferedReader br = new BufferedReader(in);

String temp;
while ((temp = br.readLine()) != null) {
out.append(temp);
}

} catch (IOException e1) {
e1.printStackTrace();
}
}

gif-ajax 샘플

acme로 이미지 생성후..
ajac로 초마다 불려오는 소스

스트러츠타일즈

넘칠때

white-space:nowrap;overflow:hide;

접근지정자

private : 하나의 클래스내에서만 사용가능한 멤버지정
package(아무것도 기재하지 않음,default라고도 함)
    : 동일파일 + 동일폴더
protected : 동일파일 + 동일폴더 + 상속
public : 객체를 가진 모든 영역
public >  protected > default(생략) > private

                 같은패키지                                    다른패키지
---------------------------------------------------------------
                같은클래스 |다른클래스 |  상속      클래스 | 상속
---------------------------------------------------------------
public            O                O              O          O         O
protected       O                O              O          X         O
default(생략)  O                O              O          X          X
private          O                X               X          X          X

CommitMonitor

http://tools.tortoisesvn.net/CommitMonitor

SVN 사용시 commit 결과를 실시간으로 알려준다..

actionform,controller를 이용한 한글처리

--폼빈에서 한글 Encoding 을 지정하는 방법 ----------------------------------
 
 public void reset(ActionMapping mapping,HttpServletRequest req){
  try{
   req.setCharacterEncoding("euc-kr");
  }catch(UnsupportedEncodingException e){
  }
 }

--RequestProcessor 클래스를 오버라이딩 하는법------------------------------
[1단계] RequestProcessor 를 클래스에 아래의 코딩을 추가한다.

package board.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;

public class MyRequestProcessor extends RequestProcessor {
 protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response) {

  boolean flag=false;
  try {
      request.setCharacterEncoding("euc-kr");  
      flag=true;
  }catch (Exception e) {
      flag=false;
  }
  return flag;
 }
}

[2단계] struts-config.xml 에 controller 요소를 추가한다.

<controller
 contentType = "text/html;charset=euc-kr"
 debug = "3"
 locale="true"
 nocache = "true"
 processorClass="board.controller.MyRequestProcessor" />

스트럿트 문서

파일업 소스

파일다운시 붙는 숫자 제거

// subject는 파일이름
// replace() 파일을 받을시 '.'이 [].으로 변경을 방지..

public String replace(String subject)
{
 String replaced="";
 int index=0;
 StringBuffer st=new StringBuffer();

 index=subject.lastlndexof(".");
 replaced=new String(subject.substring(0,index));

 // ['.' => UTF-8 code=> 2e ]앞에 % escape문자를 붙인것
 replaced=replaced.repalaceAll("\\.","%2e");
 
 sf.append(replaced);
 sf.append(subject.subSequence(index.subject.length()));
 return.st.toString();
}

JSTL 문서

2009년 6월 28일 일요일

Spring 문서

http://okjsp.pe.kr에서 펌

http://okjsp.pe.kr 에서 활동하는 Q u i c K 입니다.
사내 신규입사자용 강의문서를 만들다가 위키로 정리해서 공유합니다. 자바지기님 웹사이트, 최범균님 책, 그리고 김형담님 위키에서 도움을 많이 받았고, 웹 상의 여러 블로그에서 도움을 많이 받았습니다.

보는 방법은 해당 파일을 압축을 풀면 하위에 Frameworks라는 폴더가 있습니다.

그곳에 index.html 을 열면 차례대로 정리한 링크가 연결되어 있고 1장부터 보시면 됩니다.

본 문서는 wiki 에 정리한것을 그대로 html 로 export 받아서 압축한 것으로 강의에 쓰인 소스 또한 첨부되어 있습니다.

다만 7창이 Firefox에서는 제대로 열리는데 익스에서 열리지가 않아서 그냥 doc로 변환하고 다시 html로 변환작업을 해서 보는데 약간 거슬릴수 있으므로 FF가 있으신 분들은 2654245_백업.html 을 띄어놓고 보시면 될거 같네요.

소스 실행중 안되는 부분은 (잘 이해 안되는 부분은 책을 보시고 한번 더 봐주시길...) 아래의 메일로 보내주시면 정정하겠습니다.

cafeciel 골뱅이 한메일쩜넷

그럼 열공하시길...

 2009년 새해를 맞아 by Q u i c K

VELOCITY 문서

JSTL 문서

iBATIS 문서

이지뷰어 <= TEXT 뷰어

꿀뷰3 <= 이미지뷰어[압축파일지원]

http://www.kipple.pe.kr/win/honeyview3/

빵집 <= 압축

http://www.bkyang.com/

lyricsget <=가사추출


TranslationGet <=번역

http://cafe.naver.com/winvibe/776

정규식 웹상에서 확인

http://www.gskinner.com/RegExr/

정규식 (예)

-전자우편 주소:
/^[a-z0-9_+.-]+@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/

URL:
/^(file|gopher|news|nntp|telnet|https?|ftps?|sftp):\/\/([a-z0-9-]+\.)+[a-z0-9]{2,4}.*$/

HTML 태그 - HTML tags:
/\<(/?[^\>]+)\>/

전화 번호 - 예, 123-123-2344 혹은 123-1234-1234:
/(\d{3}).*(\d{3}).*(\d{4})/

날짜 - 예, 3/28/2007 혹은 3/28/07:
/^\d{1,2}\/\d{1,2}\/\d{2,4}$/

jpg, gif 또는 png 확장자를 가진 그림 파일명:
/([^\s]+(?=\.(jpg|gif|png))\.\2)/

1부터 50 사이의 번호 - 1과 50 포함:
/^[1-9]{1}$|^[1-4]{1}[0-9]{1}$|^50$/

16 진수로 된 색깔 번호:
/#?([A-Fa-f0-9]){3}(([A-Fa-f0-9]){3})?/

적어도 소문자 하나, 대문자 하나, 숫자 하나가 포함되어 있는 문자열(8글자 이상 15글자 이하) - 올바른 암호 형식을 확인할 때 사용될 수 있음:
/(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15}/

Define foreign key

rop table Books;
Drop table Authors;
Drop table AuthorBook;


CREATE TABLE Books (
   BookID SMALLINT NOT NULL PRIMARY KEY,
   BookTitle VARCHAR(60) NOT NULL,
   Copyright YEAR NOT NULL
)
ENGINE=INNODB;

INSERT INTO Books VALUES (1, 'Letters', 1934),
                         (2, 'Ohio', 1919),
                         (3, 'Angels', 1966),
                         (4, 'Speaks', 1932),
                         (5, 'Man', 1996),
                         (6, 'A', 1980),
                         (7, 'Card', 1992),
                         (8, 'The', 1993);

CREATE TABLE Authors (
   AuthID SMALLINT NOT NULL PRIMARY KEY,
   AuthFN VARCHAR(20),
   AuthMN VARCHAR(20),
   AuthLN VARCHAR(20)
)
ENGINE=INNODB;

INSERT INTO Authors VALUES (1, 'Henry', 'S.', 'Thompson'),
                           (2, 'Jack', 'Carol', 'Oates'),
                           (3, 'Red', NULL, 'Elk'),
                           (4, 'White', 'Maria', 'Rilke'),
                           (5, 'Anne', 'Kennedy', 'Toole'),
                           (6, 'Jane', 'G.', 'Neihardt'),
                           (7, 'Jane', NULL, 'Yin'),
                           (8, 'Alan', NULL, 'Wang');

CREATE TABLE AuthorBook (
   AuthID SMALLINT NOT NULL,
   BookID SMALLINT NOT NULL,
   PRIMARY KEY (AuthID, BookID),
   FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
   FOREIGN KEY (BookID) REFERENCES Books (BookID)
)
ENGINE=INNODB;

INSERT INTO AuthorBook VALUES (1, 8),
                              (2, 7),
                              (3, 6),
                              (4, 5),
                              (5, 4),
                              (6, 2),
                              (8, 1);

이미지 에러 처리

<img onerror="this.src='error.gif';" src="test.gif" >

입력상자에서 자리수 차면 이동하기

<SCRIPT language=JavaScript>


function Nextchk(arg,len,nextname) {
if (arg.value.length==len) {
nextname.focus() ;
return;
}
}
</SCRIPT>


<FORM method=post name=zipcode>
우편번호<INPUT maxLength=3 name=zip1 size=3

     onkeyup='Nextchk(this,3,document.zipcode.zip2)'>
-
   <INPUT maxLength=3 name=zip2 size=3>
</FORM>

CSS 사전


자식창 ==(post)==> 부모창

(자식창)

<form name="frm" method="post" action="./test.jsp" target="pwin">

.........

</form>

 

<script>

    document.frm.submit();

    self.close();

</script>

 

(부모창)

<script> window.name = "pwin"; </script>

긴 문자열 짧게 보여주기

SELECT IF(LENGTH(content) > 20, CONCAT(SUBSTRING(content, 1, 20), '....'),content) content FROM table

 content 이 20보다 길면 뒤에 '...' 을 붙여서 출력

div 내용 프린트하기

from http://mkwilson.tistory.com/entry/특정-div-프린트-하기


function content_print(){
   
                var initBody = document.body.innerHTML;
                window.onbeforeprint = function(){
                    document.body.innerHTML = document.getElementById('선택될 div id').innerHTML;
                }
                window.onafterprint = function(){
                    document.body.innerHTML = initBody;
                }
                window.print();    
            }           
        </script>

===============================================================================================

<div id='content'>
    내용 content_1
</div>

<div id='content_2'>
   내용 content_2
</div>
<input type="button" value="print" onclick="javascript:content_print();">
================================================================================================

선택될 div id  이부분에 div id 를 삽입하면 된다.
print 버튼을 누르면 지정된 div 안의 내용이 프린트 된다.

iBATIS 연습

http://www.cyworld.com/CremazerBlog/2629260 <= 에서 얻은 자료

스트럿츠 1.3 관련 문서

http://www.cyworld.com/CremazerBlog/2629260 에서 구한 자료

스트럿츠 2.0 관련문서


http://www.cyworld.com/CremazerBlog/2629260
에서 구한 문서...

복수 모듈 선언

/WEB-INF/web.xml (1)


<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/struts-default.xml</param-value>
 </init-param>
 <init-param>
  <param-name>config/user</param-name>
  <param-value>/WEB-INF/struts/struts-user.xml</param-value>
 </init-param> 
 <load-on-startup>1</load-on-startup>
</servlet>



/WEB-INF/web.xml   (2)


http://localhost/action.do

http://localhost/user/action.do

<init-param>  
   <param-name>config</param-name>  
   <param-value>/WEB-INF/struts-config.xml</param-value>  
</init-param>  
<init-param>  
   <param-name>config/user</param-name>  
   <param-value>/WEB-INF/struts-config-user.xml</param-value>  
</init-param>  



 

/WEB-INF/struts/struts-user.xml


<?xml version="1.0" encoding="euc-kr" ?>

<!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>
</struts-config>

JSTL 값에 태그가 들어 있는 경우


contents라는 변수에 <br>등의 태그가 들어 있는 경우.. 1)번 경우는 자동바꾸어서 보여준기 때문에 원하지 않는 결과가 나올수 있다..
따라서 그냥 <br>값등의 html가 그대로  필요한 경우는 2)번 경우처럼 escapeXml="false" 를 추가해야 한다.

1)  <c:out  value="${contents}"/>

2)  <c:out  value="${contents}" escapeXml="false"/>

주민등록번호 체크

//주민등록번호 체크----------------------------------------
function JuminCheck(jnum_01, jnum_02)
{
check_jumin = false
b_Year = (jnum_02.charAt(0) <= "2") ? "19" : "20"
b_Year += jnum_01.substr(0, 2)
b_Month = jnum_01.substr(2, 2) - 1
b_Date = jnum_01.substr(4, 2)
b_sum = new Date(b_Year, b_Month, b_Date)
if ( b_sum.getYear() % 100 != jnum_01.substr(0, 2) || b_sum.getMonth() != b_Month || b_sum.getDate() != b_Date)
{
return check_jumin
}
total = 0
temp = new Array(13)
for(i=1; i<=6; i++)
temp[i] = jnum_01.charAt(i-1)
for(i=7; i<=13; i++)
temp[i] = jnum_02.charAt(i-7)
for(i=1; i<=12; i++)
{
k = i + 1
if(k >= 10) k = k % 10 + 2
total = total + (temp[i] * k)
}
last_num = (11- (total % 11)) % 10
if(last_num == temp[13])
check_jumin = true
else
check_jumin = false
return check_jumin
}

최단거리알고리즘(dijkstra)


package theLeastDistance.algorithm;

import java.util.Vector;

public class Dijkstra {


int n = 0; // 정점의 갯수
final static int m = 30000; // 선이 없는 곳... 무지 큰수로 설정
int data[][]; // 전체 지도 데이타
boolean visit[]; // 방문지 확인
int dis[]; // 시작점 부터의 거리
int prev[]; // 도착점 전의 정점 저장
int s,e;  // 시작점과 끝점 저장
int stack[]; // 시작점부터 끝점까지의 순서 저장
Vector<Integer> stackV;

public void init(int dataI[][]) // 다익스트라(Dijkstra) 알고리즘/단일 점에 따라 최단거리
{
data=dataI;
n = data.length;

dis = new int[n];
visit = new boolean[n];
prev = new int[n];
stack = new int[n];
stackV=new Vector<Integer>();
}
public int theLeastDistance()
{
return dis[e-1];
}
public void start(int start,int end)
{
System.out.println("==========================================================");
System.out.println("Dijkstra start");
System.out.println("startPoint: "+start);
System.out.println("endPoint: "+end);
System.out.println("===========================================================");
s=start;
e=end;
int k=0;
int min=0;

for (int i = 0; i < n; i++) { /* 초기화 */
dis[i] = m;
prev[i] = 0;
visit[i] = false;
}

dis[s - 1] = 0; /* 시작점의 거리는 0 */
 
for (int i = 0; i < n; i++) {
min = m;
for (int j = 0; j < n; j++) { /* 정점의 수만큼 반복 */
if (visit[j] == false && dis[j] < min) { /* 확인하지 않고 거리가 짧은 정점을 찾음 */
k = j;
min = dis[j];
}
}
visit[k] = true; /* 해당 정점 확인 체크 */    
if (min == m)break; /* 연결된 곳이 없으면 종료 */
/****
* I -> J 보다 I -> K -> J의
* 거리가 더 작으면
* 갱신
****/
for (int j = 0; j < n; j++) {
if (dis[k] + data[k][j] < dis[j]) {
dis[j] = dis[k] + data[k][j]; /* 최단거리 저장*/
prev[j] = k; /* J로 가기 위해서는 K를 거쳐야 함 */
}
}
}
// nowLeastDistance();   //콘솔에서 최단거리 출력
inverseFind(); // 콘솔에서 최단 경로 출력
}
/**** 최단 거리 출력 ****/
public void nowLeastDistance()
{
System.out.printf("최단거리:  %10d       ", dis[e - 1]);
}
/**** 최단 경로를 저장 ****/
public void inverseFind()
{
int tmp = 0;
int top = -1;
tmp = e - 1;
while (true) {
stack[++top] = tmp + 1;
if (tmp == s - 1)break; /* 시작점에 이르렀으면 종료 */
tmp = prev[tmp];
}
/* 역추적 결과 출력 */
stackV.removeAllElements();
for (int i = top; i > -1; i--) {
//System.out.printf("%d", stack[i]);
stackV.add(stack[i]);
//if (i != 0)System.out.printf(" -> ");
}
//System.out.printf("\n");
}
public Vector<Integer> getStack()
{
return stackV;
}


public static void main(String[] args) {
int m=30000;
int [][]data = new int[][] {
{ 0, 2, m, m, m, 3, m, m },
{ 2, 0, 4, 1, m, m, m, m },
{ m, 4, 0, m, m, m, 3, m },
{ m, 1, m, 0, 3, m, 2, m },
{ m, m, 3, 3, 0, m, m, 4 },
{ 3, m, m, m, m, 0, 6, m },
{ m, m, m, 2, m, 6, 0, 4 },
{ m, m, m, m, 4, m, 4, 0 } };
Dijkstra k=new Dijkstra();
k.init(data);
k.start(1,3);
}

}