참고: http://stackoverflow.com/questions/7860782/request-getservletcontext-not-found-even-with-new-jar
JSP 페이지에서 request.getServletContext() 사용시 아래와 같은 에러가 발생했다.
The method getServletContext() is undefined for the type HttpServletRequest
Tomcat 7 에서는 문제가 되지 않았지만 tomcat6 에서는 문제가 되었다.
!) 원인은 HttpServletRequest 의 getServletContext() 함수는 Servlet 3.0 부터 지원되기 때문이었다. Tomcat7 부터 Servlet 3.0 을 지원한다.
그냥 getServletContext() 함수를 부르면 Tomcat 6 와 Tomcat 7 에서도 에러가 발생하지 않았다.
예)
<%= getServletContext().gerRealPath("/") %>
2012년 11월 2일 금요일
2012년 10월 12일 금요일
[JSP] getOutputStream() has already been called for this response 문제
jsp 파일에서 response.getOutputStream() 을 부르는 경우 아래와 같은 Exception 이 발생할 수 있다.
getOutputStream() has already been called for this response
이유는 하나의 jsp 파일에서 getWriter() 와 getOutputStream() 를 동시에 부를 수는 없기 때문이다.
getWriter() 함수는 jsp 내부적으로 html 을 렌더링 할 때 호출 된다.
- Tomcat 서버의 경우 만약에 개행 문자없이 오로지 java 코드 파트로만 구성된 jsp 라면 getOutputStream() 함수를 사용할 수 있었다.
- 하지만 서버 마다 다를 수 있으므로 확인해 봐야 할 것이다.
!) 개행 문자를 아래와 같이 주석을 이용하여 제거하는 방법도 생각해 볼 수 있다.
<% ... %><%--
--%><%
...
%>
2012년 7월 20일 금요일
JSP + MyBatis + MySql 샘플
참고: http://www.mybatis.org/core/ko/index.html
아래 순서로 설명.
최종 폴더 구조:
1. MySql DB 구축
- 테스트용 계정을 아래와 같이 설정했다.
User name : "username"
Password : "password"
1) test 스키마를 생성한다.
2) users 테이블을 생성한다.
3) user 를 생성한다.
2. 웹앱 생성
- 폴더 구조
web.xml 소스:
3. MyBatis 설정
3.1. 필요한 라이브러리 설치
- 다운로드
- 위 파일들을 다운로드 받아 $WEB_APP/WEB-INF/libs/ 에 복사한다.
!) MyBatis 폴더에 lib 폴더에 있는 파일들도 복사한다.
3.2. 환경 설정
- mybatis 설정 파일인 mybatis-config.xml 파일을 생성한다.(파일 이름은 중요하지 않다)
!) com.sample.mybatis.config 패키지에 생성하였다.
!) 파일 내용: JDBC 설정만 들어 있다.
3.3. 맵퍼 생성
- 필요한 파일들
- 소스 코드들
com.sample.mybatis.dto.User.java:
- mybatis-config.xml 에 추가
3.4. JSP 연동
- 서버 시작시에 SqlSessionFactory 를 생성해야 한다.
- SqlSessionFactory 를 생성하는 서블릿을 생성한다.
com.sample.mybatis.config.MyBatisConfig.java : 서버 시작시 init 함수가 실행된다.
- web.xml 설정 : load-on-startup 을 설정해 줘야 한다.
4. 웹 페이지 생성
- User 레코드 생성, 수정, 삭제 할 수 있는 페이지 (validation 미포함)
user_control.jsp :
5. 테스트
아래 순서로 설명.
1. MySql DB 구축
2. 웹앱 생성
3. MyBatis 설정
3.1. 필요한 라이브러리 설치
3.2. 환경 설정
3.3. 맵퍼 생성
3.4. JSP 연동
4. 웹 페이지 생성
5. 테스트
2. 웹앱 생성
3. MyBatis 설정
3.1. 필요한 라이브러리 설치
3.2. 환경 설정
3.3. 맵퍼 생성
3.4. JSP 연동
4. 웹 페이지 생성
5. 테스트
최종 폴더 구조:
1. MySql DB 구축
- 테스트용 계정을 아래와 같이 설정했다.
User name : "username"
Password : "password"
1) test 스키마를 생성한다.
mysql> create schema test;
2) users 테이블을 생성한다.
mysql> use test; mysql> create table users ( `username` varchar(255) not null, `password` varchar(255) not null, `email` varchar(255) not null, primary key (`username`) ) default charset=utf8;
3) user 를 생성한다.
mysql> create user 'username'@'localhost' identified by 'password';
4) test 스키마에 대한 권한을 설정한다.
mysql> grant all privileges on test.* to 'username'@'locahost';
2. 웹앱 생성
- 폴더 구조
+ $WEB_APP/ + WEB-INF/ + libs/ - web.xml + index.jsp
web.xml 소스:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
3. MyBatis 설정
3.1. 필요한 라이브러리 설치
- 다운로드
- MySql JDBC driver 다운로드 : http://www.mysql.com/downloads/connector/j/
- MyBatis 다운로드 : http://code.google.com/p/mybatis/downloads/list?can=3&q=Product%3DMyBatis
- commons dbcp 다운로드: http://commons.apache.org/dbcp/
- commons pool 다운로드: http://commons.apache.org/pool/
!) MyBatis 폴더에 lib 폴더에 있는 파일들도 복사한다.
- asm-3.3.1.jar
- cglib-2.2.2.jar
- commons-dbcp-1.4.jar
- commons-logging-1.1.1.jar
- commons-pool-1.6.jar
- log4j-1.2.16.jar
- mybatis-3.1.1.jar
- mysql-connector-java-5.1.20-bin.jar
- slf4j-api-1.6.2.jar
- slf4j-log4j12-1.6.2.jar
3.2. 환경 설정
- mybatis 설정 파일인 mybatis-config.xml 파일을 생성한다.(파일 이름은 중요하지 않다)
!) com.sample.mybatis.config 패키지에 생성하였다.
!) 파일 내용: JDBC 설정만 들어 있다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
</configuration>
3.3. 맵퍼 생성
- 필요한 파일들
- User.java - 레코드 아이템
- UserMapper.java - SQL 문 수행을 위한 인터페이스
- UserMap.xml - SQL 문 맵퍼
- 소스 코드들
com.sample.mybatis.dto.User.java:
package com.sample.mybatis.dto;
public class User {
private String username;
private String password;
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
com.sample.mybatis.dao.UserMapper.java:package com.sample.mybatis.dao;
import java.util.List;
import com.sample.mybatis.dto.User;
public interface UserMapper {
public List<User> selectAllUsers();
public User selectUser(String username);
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(String username);
}
com.sample.mybatis.sqlmap.UserMap.xml:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.sample.mybatis.dao.UserMapper">
<select id="selectAllUsers" resultType="User">
select username as username,
password as password,
email as email
from users;
</select>
<select id="selectUser" parameterType="string" resultType="User">
select username as username,
password as password,
email as email
from users
where username=#{username};
</select>
<insert id="insertUser" parameterType="User">
insert into users (username, password, email)
values (#{username}, #{password}, #{email});
</insert>
<update id="updateUser" parameterType="User">
update users set
password=#{password},
email=#{email}
where username=#{username}
</update>
<delete id="deleteUser" parameterType="string">
delete from users
where username=#{username}
</delete>
</mapper>
- mybatis-config.xml 에 추가
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- Type alias -->
<typeAliases>
<typeAlias alias="User" type="com.sample.mybatis.dto.User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<!-- UserMap.xml 등록 -->
<mappers>
<mapper resource="com/sample/mybatis/sqlmap/UserMap.xml" />
</mappers>
</configuration>
3.4. JSP 연동
- 서버 시작시에 SqlSessionFactory 를 생성해야 한다.
- SqlSessionFactory 를 생성하는 서블릿을 생성한다.
com.sample.mybatis.config.MyBatisConfig.java : 서버 시작시 init 함수가 실행된다.
package com.sample.mybatis.config;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServlet;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisConfig extends HttpServlet {
private static SqlSessionFactory sqlSessionFactory;
public void init() {
try {
InputStream inputStream = Resources.getResourceAsStream("com/sample/mybatis/config/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public static void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
MyBatisConfig.sqlSessionFactory = sqlSessionFactory;
}
}
- web.xml 설정 : load-on-startup 을 설정해 줘야 한다.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0"> <!-- MyBatis initializer 등록 --> <servlet> <servlet-name>MyBatisInitializer</servlet-name> <servlet-class>com.sample.mybatis.config.MyBatisConfig</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4. 웹 페이지 생성
- User 레코드 생성, 수정, 삭제 할 수 있는 페이지 (validation 미포함)
user_control.jsp :
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.sample.mybatis.config.MyBatisConfig" %>
<%@ page import="com.sample.mybatis.dao.*" %>
<%@ page import="com.sample.mybatis.dto.*" %>
<%@ page import="org.apache.ibatis.session.*" %>
<%@ page import="java.util.*" %>
<%
// handle operation
if (request.getMethod().equalsIgnoreCase("POST")) {
SqlSession sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
String subtype = request.getParameter("subtype");
if (subtype.equals("create-user")) {
User user = new User();
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user.setEmail(request.getParameter("email"));
userMapper.insertUser(user);
} else if (subtype.equals("modify-user")) {
User user = new User();
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user.setEmail(request.getParameter("email"));
userMapper.updateUser(user);
} else if (subtype.equals("delete-user")) {
userMapper.deleteUser(request.getParameter("username"));
}
} finally {
sqlSession.close();
}
}
// select users
List<User> users = null;
SqlSession sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
users = userMapper.selectAllUsers();
} finally {
sqlSession.close();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Control</title>
</head>
<body>
<h2>Create User</h2>
<form name="create-form" method="post">
<input type="hidden" name="subtype" value="create-user" />
Username: <input type="text" name="username" value="" /><br />
Password: <input type="password" name="password" value="" /><br />
Email: <input type="email" name="email" value="" /><br />
<input type="submit" value="Create" />
</form>
<h2>User List</h2>
<ul>
<%
if (users == null || users.size() == 0) {
%><li>no user</li><%
} else {
for (User user : users) {
%>
<li style="border:solid 1px black;padding:4px;margin-bottom:5px;">
<form name="modify-form" method="post">
<input type="hidden" name="subtype" value="modify-user" />
<input type="hidden" name="username" value="<%= user.getUsername() %>" />
Username: <%= user.getUsername() %><br />
Password: <input type="password" name="password" value="" /><br />
Email: <input type="text" name="email" value="<%= user.getEmail() %>" /><br />
<input type="submit" value="Modify" />
</form>
<form name="delete-form" method="post">
<input type="hidden" name="subtype" value="delete-user" />
<input type="hidden" name="username" value="<%= user.getUsername() %>" />
<input type="submit" value="Delete" />
</form>
</li>
<%
}
}
%>
</ul>
</body>
</html>
!) SqlSessionFactory.openSession() 함수에 true 를 인자로 주면 작업이 끝나면 자동으로 commit 한다.5. 테스트
2012년 5월 31일 목요일
Servlet 클래스 등록하기
다음과 같은 순서다.
1. servlet 작성
2. servlet 컴파일
3. web.xml 에 등록
myapp 이라는 프로젝트를 만드는 것으로 가정한다.
대략 아래와 같은 구조이다.
1. servlet 작성
javax.servlet.http.HttpServlet 클래스를 상속받아 doGet 또는 doPost 함수를 작성한다.
doGet 은 GET 방식으로 접속한 경우 호출 되는 함수이고 doPost 는 POST 방식으로 접속한 경우 호출되는 함수 이다.
예) src 라는 폴더를 만들고 com/myapp/servlet/ 폴더 구조로 HelloServlet.java 를 만듬
2. servlet 컴파일
컴파일 하기 위해선 $TOMCAT_HOME/lib 에 servlet-api.jar 파일이 필요하다.
-cp 에 servlet-api.jar 를 추가한다.
예)
export TOMCAT_HOME=/Users/username/apache-tomcat/
export PROEJCT_HOME=/Users/username/project/myapp/
$ javac -cp $TOMCAT_HOME/lib/servlet-api.jar -d $TOMCAT_HOME/webapps/myapp/WEB-INF/classes $(find $PROJECT_HOME/src -name *.java)
!) 참고
- Ant 로 컴파일 : http://tjjava.blogspot.kr/2012/06/ant.html
- javac 로 컴파일 : http://tjjava.blogspot.kr/search/label/javac
3. web.xml 에 등록
servlet 태그로 servlet class 를 등록하고 servlet-mapping 태그로 url 를 매핑한다.
!) url pattern 작성시 / 로 시작해야 하는 점에 주의한다.
예)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.myapp.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4. 테스트
tomcat 을 재시작한다.
http://localhost:8080/myapp/hello 로 접속하여 Hello World 를 확인 할 수 있으면 된다.
1. servlet 작성
2. servlet 컴파일
3. web.xml 에 등록
myapp 이라는 프로젝트를 만드는 것으로 가정한다.
대략 아래와 같은 구조이다.
/Users/username/
+ project/myapp/src/com/myapp/servlet/
+ HelloServlet.java
+ apache-tomcat/webapps/myapp
+ WEB-INF/
+ classes/com/myapp/servlet/
+ HelloServlet.class
+ web.xml
1. servlet 작성
javax.servlet.http.HttpServlet 클래스를 상속받아 doGet 또는 doPost 함수를 작성한다.
doGet 은 GET 방식으로 접속한 경우 호출 되는 함수이고 doPost 는 POST 방식으로 접속한 경우 호출되는 함수 이다.
예) src 라는 폴더를 만들고 com/myapp/servlet/ 폴더 구조로 HelloServlet.java 를 만듬
package com.myspp.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Hello World");
}
}
2. servlet 컴파일
컴파일 하기 위해선 $TOMCAT_HOME/lib 에 servlet-api.jar 파일이 필요하다.
-cp 에 servlet-api.jar 를 추가한다.
예)
export TOMCAT_HOME=/Users/username/apache-tomcat/
export PROEJCT_HOME=/Users/username/project/myapp/
$ javac -cp $TOMCAT_HOME/lib/servlet-api.jar -d $TOMCAT_HOME/webapps/myapp/WEB-INF/classes $(find $PROJECT_HOME/src -name *.java)
!) 참고
- Ant 로 컴파일 : http://tjjava.blogspot.kr/2012/06/ant.html
- javac 로 컴파일 : http://tjjava.blogspot.kr/search/label/javac
3. web.xml 에 등록
servlet 태그로 servlet class 를 등록하고 servlet-mapping 태그로 url 를 매핑한다.
!) url pattern 작성시 / 로 시작해야 하는 점에 주의한다.
예)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.myapp.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4. 테스트
tomcat 을 재시작한다.
http://localhost:8080/myapp/hello 로 접속하여 Hello World 를 확인 할 수 있으면 된다.
2012년 5월 15일 화요일
JSP session 처리
[session 활성화]
session = request.getSession(true);
또는
<%@page session="true"%>
- 매개변수를 true 로 주면 기존에 session 이 존재하지 않은 경우 session 을 생성한다.
참고: http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getSession(boolean)
!) session 변수는 내부적으로 미리 정의된 변수이기 때문에 새로 선언을 할 수 없다.
[session 값 설정]
session.setAttribute("key", "value");
- key 는 string 타입이고 value 는 Object 타입이다.
[session 값 얻기]
String value = (String)session.getAttribute("key");
- 리턴 타입이 Object 타입이기 때문에 Casting 해줘야 한다.
[session 값 지우기]
session.removeAttribute("key");
[session timeout 설정]
session = request.getSession(true);
또는
<%@page session="true"%>
- 매개변수를 true 로 주면 기존에 session 이 존재하지 않은 경우 session 을 생성한다.
참고: http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getSession(boolean)
!) session 변수는 내부적으로 미리 정의된 변수이기 때문에 새로 선언을 할 수 없다.
[session 값 설정]
session.setAttribute("key", "value");
- key 는 string 타입이고 value 는 Object 타입이다.
[session 값 얻기]
String value = (String)session.getAttribute("key");
- 리턴 타입이 Object 타입이기 때문에 Casting 해줘야 한다.
[session 값 지우기]
session.removeAttribute("key");
[session timeout 설정]
web.xml 파일 설정 (분 단위)
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
피드 구독하기:
글 (Atom)




