레이블이 JSP인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JSP인 게시물을 표시합니다. 모든 게시물 표시

2010년 4월 23일 금요일

301 Redirect

출처: http://blog.artience.co.kr/36

위치로그 태그 미디어로그 방명록

오늘은 301 Redirect 이야기를 해보려 합니다.

일반적으로 사이트를 운영하다 보면 여러 이유들로 인해서 도메인이 변경이 되거나 특정 페이지 URL 의 변경이 생길 수 있습니다.
예를 들어 www.oldurl.com 을 운영중에 도메인이 www.newurl.com 으로 변경 되었다고 가정하여 보겠습니다.
이런 경우 보통 www.oldurl.com 페이지의 HTML 내용에 아래와 같은 내용으로 페이지를 강제 이동시키는 것을 볼수 있습니다.

1. javascript
document.lcoation.href = "http://wwww.newurl.com";

2. Meta Refresh
<meta http-equiv="refresh" content="0; url=http://wwww.newurl.com">

이런 방식은 사용자의 구 사이트 방문을 신규사이트로 이동 시켜주는 역활은 가능합니다.

그런데 만약...
 www.oldurl.com도메인이 검색엔진에 등록이 되어있고 특정 키워드로 검색결과 1위에 노출되고 있었다면...
그렇다면 검색엔진은 위의 1, 2 번 방식의 내용을 통하여
www.oldurl.com 에서 www.newurl.com 으로 도메인이 변경 되었다고 인식할까요?
그렇다고 하면 동일 키워드로 검색 시
www.newurl.com 도메인도 구 도메인 처럼 1위에 노출이 될까요?


정답은 "아니오" 입니다.

이점이 301 Redirect 이야기를 하려는 핵심 입니다.

(여기서 301 이란? HTTP 상태코드의 하나로 요청 페이지가 영구적으로 신규 페이지로 변경되었음을 알려주는 HTTP 상태코드)

즉 검색엔진에게 www.oldurl.com 요청이 오면 301 응답을 통하여 www.newurl.com 으로 도메인이 영구 변경되었음을 알려주는 역활을 합니다.
301 Redirect 사용 시 구 도메인 방문자를 신규 사이트로 전환하여 주며 검색엔진 검색순위 보존, 외부링크 인기도 보존, Google PageRank 까지도 보존이 가능하게 됩니다.

이런 이유로 도메인 변경이나 페이지 URL 의 변경 시 301 Redirect 는 필수 요소 입니다.

그럼 간단히 301 Redirect 설정을 알아보죠.
역시 www.oldurl.com 과  www.newurl.com 을 이용하여 설명 드리겠습니다.

가장 널리 이용되고 있는 apache 웹서버의 경우 .htaccess 를 이용한 방법 설명 입니다.

메모장같은 텍스트 에디터를 이용 아래의 내용으로 작성하여 .htaccess 파일명으로 저장  www.oldurl.com 홈 디렉토리에 업로드 하시면 됩니다.
Redirect 301 / http://www.newurl.com/

참 쉽죠~

또 다른 방법으로는 사용하는 각 언어별 직접 소스 적용 방법이 있습니다.

PHP
<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.newurl.com/" );
?>


ASP
<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location",http://www.newurl.com/
%>


ASP .NET
<script runat="server">
  private void Page_Load(object sender, System.EventArgs e){
   Response.Status = "301 Moved Permanently";
   Response.AddHeader("Location",http://www.newurl.com/);
  }
</script>


JSP
<%
response.setStatus(301);
response.setHeader( "Location", http://www.newurl.com/ );
response.setHeader( "Connection", "close" );
%>

이제 도메인 변경이나 페이지 url 변경 시 꼭 301 Redirect 사용하실거죠~~
이상 아티언스 필진 Nisha 였습니다. 좋은 하루 되세요~ ^.~

301 Redirect의 다른 활용법을 알고 싶으시다면....클릭클릭

2010년 4월 6일 화요일

Ibatis 트랜잭션


try {
sqlMap.startTransaction ();
.....

sqlMap.commitTransaction ();
} finally {
sqlMap.endTransaction ();
}

==========================================================
public class IBatis {
   
    private static SqlMapClient sqlMapClient;
   
    /**
     * <pre>
     * SqlMapClient 객체를 구해오는 메소드입니다.
     * </pre>
     *
     * @return
     */
    public static synchronized SqlMapClient getSqlMapClient(){
        if(sqlMapClient==null){
            String resource = "kr/co/dungeonMaster/db/SqlMapConfig.xml";
            Reader reader;
            try {
                reader = Resources.getResourceAsReader(resource);
                sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
                reader.close();
            } catch (IOException e) {
                throw new RuntimeException("Something bad happened while building the SqlMapClient instance."+ e, e);
            }
        }
        return sqlMapClient;
    }
   
}

2010년 1월 18일 월요일

JSP 내장 객체

JSP 내장 객체

서블릿 컨테이너의 웹 브라우저 요청 처리 방법

1. 사용자가 선택한 링크에 의해 웹 브라우저로부터 들어온 요청(HTTP request)을 컨테이너가 받아들입니다.

2. 컨테이너는 요청한 서블릿을 위해 HttpServletRequest와 HttpServletResponse 객체를 생성합니다. HttpServletRequest 객체는 폼 파라메터 정보를 가지고 있습니다.

3. 서블릿은 스레드를 만들어서 서비스할 준비를 합니다.

4. 서블릿 컨테이너는 request 객체와 response 객체를 인자로 스레드에게 전달합니다.

5. 컨테이너는 service() 메서드를 호출하여 6. GET 방식으로 처리할 지 POST 방식으로 처리할 결정합니다. doGet() 메서드나 doPost() 메서드를 호출하여 동적인 HTML 문서를 response 객체에 담아서 전송합니다.

request 객체
(javax.servlet.http.HttpServletRequest)

웹 브라우저로부터 전송받은 HTTP request message의 HTTP Header 부분과 HTTP Body 부분의 정보를 보관하고 있는 객체입니다.

request parameter 처리 메서드들

public String getParameter(String name)
요청 파라메터 name에 할당된 값을 리턴합니다.
public Enumeration getParameterNames()
요청에 사용된 모든 파라메터 이름을 리턴합니다.
public String[] getParameterValues(String name)
지정된 파라메터 이름에 대한 값들을 리턴합니다. CGI Form 에서 같은 name 속성으로 지정된 값들은 이 메서드를 사용하여 읽어낼 수 있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파라메터 정보 읽기</title>
</head>
<body>
<h1>파라메터 정보 읽기</h1>
<p>
<%= request.getQueryString()%><br />
<%
Enumeration<String> paraNames = request.getParameterNames();

while (paraNames.hasMoreElements()) {
	String paraName = paraNames.nextElement();
%>
	<strong><%= paraName %></strong>:
	<%= request.getParameter(paraName) %><br />
<%
}
%>
</p>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Checkbox 데이터</title>
</head>
<body>
<h1>취미 선택</h1>
<form method="post" action="<%= request.getRequestURL() %>">
<input type="checkbox" id="chk1" name="hobby" value="축구" />
<label for="chk1">축구</label>
<input type="checkbox" id="chk2" name="hobby" value="배구" />
<label for="chk2">배구</label>
<input type="checkbox" id="chk3" name="hobby" value="농구" />
<label for="chk3">농구</label><br />
<input type="checkbox" id="chk4" name="hobby" value="바둑" />
<label for="chk4">바둑</label>
<input type="checkbox" id="chk5" name="hobby" value="낚시" />
<label for="chk5">낚시</label>
<input type="checkbox" id="chk6" name="hobby" value="등산" />
<label for="chk6">등산</label><br />
<input type="submit" value="전송" />
</form>
<% if (request.getParameter("hobby") != null) { %>
<p>
당신이 선택한 취미 :
	<% boolean toggle = false; %>
	<% for (String value : request.getParameterValues("hobby")) { %>
		<% if (toggle) out.println(", "); else toggle = true; %>
		<%= value %>
	<% } %>
</p>
<% } %>
</body>
</html>

HTTP 헤더와 관련한 메서드들

public String getHeader(String headerName)
HTTP 요청 헤더에 지정된 headerName의 값을 리턴합니다.
public Enumeration getHeaderNames()
HTTP 요청 헤더에 지정된 모든 헤더의 이름을 리턴합니다.
public Enumeration getHeaders(String headerName)
HTTP 요청 헤더에 포함된 모든 값들을 리턴합니다.
public int getIntHeaders(String headerName)
HTTP 요청 헤더에 지정된 headerName의 값을 int 형으로 리턴합니다.
public long getDateHeader(String headerName)
HTTP 요청 헤더에 포함된 headerName의 값을 1970년 1월 1일 0시 0분을 기준으로 한 현재까지의 밀리초를 리턴합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Request 정보 확인 예</title> </head> <body> <h1>Header 정보들</h1> <p> <%= request.getMethod() %> <%= request.getRequestURL() %> <%= request.getProtocol() %><br /> <% Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); %> <%= headerName %>: <%= request.getHeader(headerName) %><br /> <% } %> </p> </body> </html>
<%@ page import="java.util.Enumeration" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>POST 방식</title>
</head>
<body>
<form method="post" action="jsp_request_ex03.jsp">
<label for="user">사용자</label>
<input type="text" id="user" name="user" /><br />
<label for="passwd">암호</label>
<input type="password" id="passwd" name="passwd" /><br />
<input type="submit" value="전송" /><input type="reset" value="취소" />
</form>
<% if (request.getParameterNames() != null) { %>
<p>
	<%
	Enumeration<String> parameters = request.getParameterNames();
	while (parameters.hasMoreElements()) {
		String parameter = parameters.nextElement(); %>
		<%= parameter %>: <%= request.getParameter(parameter) %><br />
	<% } %>
</p>
<% } %>
</body>
</html>

세션과 관련한 메서드들

public HttpSession getSession()
요청을 시도한 클라이언트에 지정된 HttpSession 객체를 리턴합니다. 만일 이전에 생성된 HttpSession 객체가 존재하지 않으면 새로운 세션 객체를 생성합니다.
public HttpSession getSession(boolean create)
create의 값이 true인 경우 이전에 생성된 HttpSession 객체가 존재하지 않으면 새로운 세션 객체를 생성합니다. false인 경우 null을 리턴합니다.
public String getRequestedSessionId()
요청을 시도한 클라이언트의 세션 id를 리턴합니다.
public boolean getRequestedSessionIdValid()
요청에 포함된 세션 id가 유효 여부를 리턴합니다.
isRequestedSessionIdFromCookie()
요청에 포함된 클라이언트의 세션 id가 쿠키로 전달되었는지 여부를 리턴합니다.
isRequestedSessionIdFromURL()
요청에 포함된 클라이언트의 세션 id가 URL에 포함되었는지 결과를 리턴합니다.

쿠키와 관련된 메서드

public Cookie[] getCookies()
클라이언트의 요청에 포함된 쿠키를 리턴합니다.

요청에 포함된 URL/URI와 관련한 메서드들

public String getRequestURI()
요청에 포함된 URL에서 URI 문자열을 리턴합니다.
public String getQueryString()
요엋에 포함된 쿼리 문자열을 리턴합니다.
public String getMethod()
요청에 포함된 요청 방식을 리턴합니다.

인코딩과 관련한 메서드

public void setCharacterEncoding(String encoding)

CGI Form을 통해 전달된 파라메터 값들을 일괄적으로 인코딩을 지정하는 메서드입니다. 톰캣에서는 4 버전부터 사용되고 있으며 다음 코드의 대신 사용합니다.

String name = request.getParameter("name");
if (name != null)
	name = new String(name.getBytes("8859_1"), "euc-kr");

웹 브라우저로부터 전송된 파라메터는 기본적으로 "ISO 8859-1"로 인코딩되기 때문에 한글 사용시 서버측으로 전송된 파라메터의 인코딩을 "EUC-KR"이나 "UTF-8"로 인코딩을 다시 변환해 주어야 한글이 제대로 서버로 전송됩니다.

response 객체
(javax.servlet.http.HttpServletRespose)

요청을 시도한 클라이언트로 전송할 응답 메시지를 저장하고 있는 객체입니다.

public void addCookie(javax.servlet.http.Cookie cookie)
쿠키를 응답 헤더에 추가합니다. 클라이언트는 이 응답을 받으면 지정된 쿠키를 저장하게 됩니다.
public boolean containsHeader(String headerName)
응답 헤더에 지정된 headerName의 포함 여부를 리턴합니다.
public void sendRedirect(String location) throws IOException
지정된 location으로 요청을 재전송합니다. 웹 브라우저의 주소창의 주소가 변경됩니다.
pulbic String encodeURL(String url)
현재 요청을 사용한 클라이언트가 쿠키를 지원할 경우 파라메터로 받은 URL을 그대로 문자열로 리턴하고 쿠키를 지원하지 않을 경우 URL에 세션 id를 쿼리 문자열로 추가한 URL을 리턴합니다. 세션이 유지된 클라이언트의 세션 id를 전송하려는 경우 URL Rewriting 기법을 사용할 수 있도록 지원합니다.
public String encodeRedirectedURL(String url)
세션이 유지된 클라이언트의 세션 id를 쿠키를 지원하지 않는 브라우저로 전달하기 위해 URL에 세션 id를 쿼리 문자열로 추가하여 리턴합니다.
public void setStatus(int status_code)
HTTP 응답 상태 코드를 설정합니다. 웹 서버가 자동으로 설정하는 응답 코드를 프로그래머가 의도적으로 변경할 수 있도록 합니다.
public void sendError(int status_code) throws IOException
setStatus()와 비슷하지만 서버측 에러 상황을 클라이언트로 전송하기 위해 HTTP 응답 헤더에 상태 코드를 설정합니다.
public void sendError(int status_code, String message) throws IOException
서버측 에러의 상태 코드와 설명 메시지를 함께 설정합니다.
public void setHeader(String headerName, String value)
HTTP 응답 헤더에 프로그래머가 지정한 헤더 정보를 설정합니다.
public void setDateHeader(String headerName, long dateMil)
1970년 1월 1일 0시 0분 0초를 기준으로 밀리초 경과된 날짜를 헤더 정보로 설정합니다.
public void setIntHeader(String headerName, int intValue)
int 값을 헤더 정보로 설정합니다. "Expires"와 같이 숫자 값을 가지는 헤더 정보 설정에 사용합니다.

 

펌글!!!!

http://jeongsam.net/126

2009년 12월 19일 토요일

jstl 글자수 자르기

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:if test="${fn:length(reply.s_content) > 18}">
    <c:out value="${fn:substring(reply.s_content,0,15)}" />...                    
</c:if>
<c:if test="${fn:length(reply.s_content) <= 18}">
    ${reply.s_content}
 </c:if>

2009년 12월 15일 화요일

파라미터 까지 주소를 가져오는 소스 입니다.

public String getUrl(HttpServletRequest request)
 {
  String parameterList = "";
  String ret_url = request.getRequestURI();            // No Parameter url
 
  int k=0;
 
  for (java.util.Enumeration e = request.getParameterNames(); e.hasMoreElements() ;k++) {
   String name = (String) e.nextElement();
   String[] value = request.getParameterValues(name);

   if (k == 0) ret_url = ret_url + "?";
   else if (k>0) ret_url = ret_url + "&";
   parameterList = parameterList + "&";

   for (int q=0; q<value.length;q++){                                
    if (q>0) {
     ret_url = ret_url + "&";
     parameterList = parameterList + "&";
    }
    ret_url = ret_url + name + "=" + value[q];
    parameterList = parameterList + name + "=" + value[q];
   }

  }

  String result=ret_url;
  return result;
 }

실제 주소 가져오기


String saveFolder = "/test/a/";
String dir = getServletContext().getRealPath(saveFolder);
System.out.println("dir:"+dir);

2009년 11월 11일 수요일

jsp 가위/바위/보

////////////////////////////////////////////////////////////////////////

// 2009. 11. 10 Yang.Nam.Seok

////////////////////////////////////////////////////////////////////////

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
 // 파일명 : game.jsp
 // 이 부분에 필요한 코드를 넣어주세요.
 // 1. 입력된 파라미터 처리하기
 // 2. 새로운 값(Random) 만들기
 // 3. 사용자가 입력한 값과 새로 만든 값을 비교하여 승패 처리하기 ; CurrentResult 라는 변수에 '승' 또는 '패'를 지정함
 // 4. 세션에서 기존 승패 기록값 가져오기
 // 5. 처리된 새로운 값으로 계산해서 세션에 넣기
 
 // 결과 가져오기
 int TotalWin=0;
 int TotalLose=0;

  java.util.Enumeration names=session.getAttributeNames();
  while(names.hasMoreElements())
  {
  String name=(String)names.nextElement();  
  if(name.equals("TotalWin"))TotalWin =(Integer)session.getAttribute("TotalWin");
  else if(name.equals("TotalLose"))TotalLose =(Integer)session.getAttribute("TotalLose");
  }

 //////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////
 
 String CurrentResult=""; //승부결과저장
 
 // 선택////////////////////////////////////////////////////////////////
 request.setCharacterEncoding("EUC-KR");
 String selection=request.getParameter("selection");
 if(selection!=null)
 {
  int sel=Integer.parseInt(selection);
 
  // 컴퓨터의 결과/////////////////////////////////////////////////////////
  java.util.Random rd=new java.util.Random();
  int com=1+rd.nextInt(3); // 1~3
 
  //가위바위보결과////////////////////////////////////////////////////////
  if(sel==com)CurrentResult="무승부";
  else if((sel==1 && com==2)||(sel==2 && com==3)||(sel==3 && com==1))
  {
    CurrentResult="패";
    TotalLose+=1;
  }
  else
  {
    CurrentResult="승";
    TotalWin+=1;
  }
 }

 // 처리된 새로운 값으로 계산해서 세션에 넣기//////////////////////////////////
 session.setAttribute("TotalWin",TotalWin);
 session.setAttribute("TotalLose",TotalLose);

%>
<html>
<head>
<title>가위바위보의 경기 기록은 Session에 저장되어야 합니다.</title>
</head>
<%
 if(selection!=null)
 {
%>
<div style="border:2px sold #E88; padding-top:20px; width:400px; height:60px; font-size:18px;">
이번 가위바위보의 결과는, 당신의 <%=CurrentResult%>입니다.
</div>
<%
 }
%>
<form name="game" action="game.jsp" method="post">
<input type="radio" name="selection" value="1" >가위
<input type="radio" name="selection" value="2" >바위
<input type="radio" name="selection" value="3" >보
<input type="submit" value="가위바위보!">
</form>
<div style="border:1px sold #AAA; width:400px; height:20px;">
현재까지의 기록 : <%=TotalWin%> 승 <%=TotalLose%> 패 </div>
</html>

2009년 8월 2일 일요일

Struts 다중 업로드

view부분을 struts-html 를 사용하지 않고 다중 업로드를 처리하는 편법..

2009.8.1 yang.nam.seok

 

-------jsp--inputview--------------------------------------------------------

 <input type="file" name="file[0]" />
 <input type="file" name="file[1]" />

-------actionform--------------------------------------------------------

 private Vector<FormFile> filelist = new Vector<FormFile>();

 public FormFile getFile(int i) {
  return (FormFile)filelist.elementAt(i);
 }

 public void setFile(int i,FormFile f) {
  if(!f.toString().equals(""))filelist.addElement(f);
 }

 public int getfilelist()
 {
  return filelist.size();
 }
 public void reset(ActionMapping map, HttpServletRequest request)
 {
  filelist.removeAllElements();
 }

-----actionform-----------------------------------------------------

for(int i=0;i<af.getfilelist();i++) //파일업 테스트
  {
   System.out.println("Size:"+af.getfilelist());
   String name=FileSave.saveFile(this,af.getFile(i)).getRealName();
  }

 

2009년 7월 28일 화요일

클래스패스의 리소스 사용법

웹 애플리케이션은 보통 애플리케이션의 설정을 담고 있는 파일이 필요하다. web.xml, struts-config.xml 등의 설정 파일들은 보통 웹 애플리케이션의 /WEB-INF/에 위치하게 되는데 그 외에 애플리케이션에서 사용하는 파일들은 어디에 놓고 사용하는 것이 편리할까? 가장 관리하기 쉽고 부가적인 작업이 적은 방법은 클래스패스에 두는 것이다. /WEB-INF/classes에 두면 자바의 클래스로더를 이용해서 이런 파일들에 접근할 수 있다. log4j 등 많은 라이브러리들이 자신의 설정 파일을 클래스패스에서 가장 먼저 찾게 된다.

 

    public File getFile(String name) {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        return new File(loader.getResource(name).getFile());
    }

    public void doSomeProcess() {
        File file = getFile("config.xml");
    }

 

 

http://youngrok.com/wiki/wiki.php/%C0%DA%B9%D9%C0%A5%C7%C1%B7%CE%B1%D7%B7%A1%B8%D3%C0%C7%B1%E2%BA%BB#s-4.2.7

properties 파일 상대경로 설정하기

properties 파일의 경로를 설정하는 방법

 

request.getRealPath("/")  를 이용해서 경로를 구한뒤 그 뒤에 문자열을 붙여서 처리

 

String file = request.getRealPath("/")+"WEB-INF/db.properties";

2009년 7월 24일 금요일

NO_Cache 설정...

HTML
<META http-equiv="Expires" content="-1">
<META http-equiv="Pragma" content="no-cache">
<META http-equiv="Cache-Control" content="no-Cache">

 

ASP
<%
Response.Expires=0
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "Cache-Control","no-cache,must-revalidate"
%>

 

JSP
<%
response.setHeader("Cache-Control","no-store");
response.setHeader("Pragma","no-cache");
response.setDateHeader("Expires",0);
if(request.getProtocal().equals("HTTP/1.1"))
 response.setHeader("Cache-Control","no-cache");
%>

 

PHP
<?
header("Pragma:no-cache");
header("Cache-Control:no-chche,must-revalidate");
?>

 

Struts Framework
<controller nocache="true" />                <= struts-config.xml  

2009년 7월 15일 수요일

split

<c:forTokens var="op"items="${goods.op}" delims="/">
          <option value="<c:out value="${op}" />"><c:out value="${op}" />
           </option>
</c:forTokens>

 

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

goods.op에 있는 문자를 /로 구별해서 나눈다.

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

 

<%@ taglib prefix="c"    uri="http://java.sun.com/jstl/core" %>

<c:set var="names" value="A:B;C|D" scope="page" />

<html>
  <head>
    <title>forTokens action</title>
  </head>

  <body>
    <c:forTokens items="${pageScope.names}"
                 delims=":;|"
                 var="currentName"
                 varStatus="status"
      >
      Family member #<c:out value="${status.count}" /> is
        <c:out value="${currentName}" /> <br />
    </c:forTokens>
  </body>
</html>

2009년 7월 1일 수요일

filedown

package com.java.fileup;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 public class Download extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  execute(request, response);
}  
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
execute(request, response);
}        
//사용자정의 함수---------------------------------------------------------------------------
protected void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = getServletContext().getRealPath("/storage");  //서비스항목으로 위치 찾기
String filename = new String(request.getParameter("clip").getBytes("8859_1"),"euckr");
String originalfilename = new String(request.getParameter("original").getBytes("8859_1"),"euckr");
File file = new File(path + "/" + filename);
System.out.println("파일경로 : " + file);
setHeaderType(response, file,originalfilename);
transport(new FileInputStream(file), response.getOutputStream(), file);
}
//파일의 이름, 용량, 파일의 타입(이미지,음악,텍스트....) : 사용자정의함수----------------
private void setHeaderType(HttpServletResponse response, File file,String originalfilename)
{
String mime = getServletContext().getMimeType(file.toString());
if(mime != null)mime = "application/octet-stream";
response.setContentType(mime);
response.setHeader("Content-Disposition",
                         "attachment;filename=" + K2E(replace(originalfilename)));
response.setHeader("Content-Length", ""+file.length());
}
//파일전송 : 사용자정의함수----------------------------------------------------------------
private void transport(InputStream in, OutputStream out, File file)
throws IOException
{
BufferedInputStream  bin = null;
BufferedOutputStream bos = null;
try{
bin = new BufferedInputStream(in);
bos = new BufferedOutputStream(out);
byte [] buf = new byte[(int) file.length()];
int read=0;
while((read = bin.read(buf))  != -1)
{
bos.write(buf, 0, read);                //객체, 시작(offset),길이
}
}catch(Exception e){
System.out.println("transport error : " + e);
}finally{
bos.close();
bin.close();
}
}
 ///////////////////////////////////////////////////////////////////////
public String K2E(String  str)
{
String tmp = null;
try{
tmp = new String (str.getBytes("euckr"), "8859_1");
}catch(Exception e){ }
return tmp;
}
 
////파일이름에 .이 있는 경우 [] 붙는거 방지////////////////////////////
// subject는 파일이름
// replace() 파일을 받을시 '.'이 [].으로 변경을 방지..

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

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

//           '.'    =>    UTF-8 code    =>   '%2e'
replaced=replaced.replaceAll("\\.","%2e");
st.append(replaced);
st.append(subject.subSequence(index,subject.length()));
return st.toString();
}
 }
 

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.");
        }
    }
}

 

스트러츠타일즈

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();
}