일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ReactNative
- 정보처리기사
- 자바스크립트
- 오라클
- php
- 코딩테스트
- 리액트네이티브
- javascript
- VUE
- CSS
- 타입스크립트
- 자스코테
- 자바스크립트 코딩테스트
- Oracle
- 자바의정석
- Java의정석
- 정보처리기사요약
- 평일코딩
- 리액트
- spring
- react
- 정보처리기사실기
- 국비코딩
- 국비IT
- 이안의평일코딩
- typescript
- 정보처리기사실기요약
- 정보처리기사실기정리
- 정보처리기사정리
- 스프링
- Today
- Total
이안의 평일코딩
JSP 7일차 - Interface, 자유게시판 본문
2020.10.12(월)
* 인터페이스
서로 다른 여러개의 클래스를 묶어서 한개의 이름(인터페이스)으로 관리(제어)
상속 extends, implements
class A => A 데이터형
class B => B 데이터형
interface I
class C implements I => 데이터형 (I, C)
interface 동물
class 개 implements 동물 (개, 동물)
동물 ani = new 개()
=> 인터페이스에 존재하는 메소드에 한정 => 인터페이스에 메소드를 증가하면 => 구현하고 있는 모든 클래스가 에러발생
=> POJO (인터페이스 구현(X), 상속(X)) => 구분(어노테이션) => Spring
기능(요청) 처리하는 메소드 => Model의 모든 클래스가 요청을 처리하기 위한 메소드
Call By References (클래스, 배열 => 메모리 주소 이용하는 방식)
주소(메모리) => 값을 주소에 채워주는 방식
매개변수 전송 방식
- Call by Value : 다른 메모리에 값을 복사(일반 데이터)
- Call by Reference : 같은 메모리 주소. 원본이 넘어간다
Java Resources/src
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>
<!-- 오라클을 연결하기 위한 환경설정 : 한개만 사용 -->
<!-- properties 파일 읽기 -->
<!-- MyBatis,Spring : 기본 디폴트 폴더가 src -->
<properties resource="db.properties"/>
<typeAliases>
<!-- VO를 등록 -->
<typeAlias type="com.sist.dao.BoardVO" alias="BoardVO"/>
<!--
오라클에서 가지고 오는 데이터를 받아서 저장
while(rs.next())
{
DataBoardVO vo=new DataBoardVO(); // 셋팅
vo.setNo(rs.getInt(1));
==
==
==
}
-->
</typeAliases>
<!-- 오라클 연결하는 부분 : getConnection() -->
<environments default="development"><!-- 개발 환경을 만든다 -->
<environment id="development">
<!-- Commit,Rollback => Transection -->
<!--
트랜잭션 처리 방법
자동처리 : 일반적으로 많이 사용 => JDBC
수동처리 : 프로그래머가 처리 => MANAGED
COMMIT : 정상처리 => 저장을 요청
ROLLABCK : SQL문장이 틀렸다 => 실행하지 않는다 : UNDO (ctrl+z)
-->
<transactionManager type="JDBC"/>
<!-- 오라클 정보를 모아서 MyBatis 라이브러리에 전송 : DataSource -->
<dataSource type="POOLED">
<!--
UNPOOLED : 요청(SQL문장 실행)할때 오라클 연결 , 결과값을 가지고 오면 오라클 연결 해제
=> 연결하는 시간이 많이 소모(연결이 지연될 수 도 있다)
POOLED : DBCP (미리 Connection을 연결하고 요청시마다 연결된 Connection을 넘겨준다
사용후에는 반환=> 다시 재사용이 가능)
=> 연결하는 소모되지 않는다
=> Connection의 생성 갯수를 제어 할 수 있다
=> 일반적으로 웹프로그램에서는 기본으로 사용
-->
<!-- 오라클 연결을 위한 기본정보를 마이바티스로 전송 -->
<!--
db.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@211.238.142.000:1521:XE
username=hr
password=happy
-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!-- Connection : 8개 -->
<!--
public class PooledDataSource
{
private String driver;
private String url;
private String username;
private String password;
}
public class MyBatisDAO
{
private DataSource dataSource;
public MyBatisDAO()
{
Class.forName(dataSource.getDriver()); ==> 필요한 데이터 => XML로 설정
}
public void getConnection()
{
conn=DriverManager.getConnection(dataSource.getUrl(),
dataSource.getUsername(),dataSource.getPassword())
}
}
-->
</dataSource>
</environment>
</environments>
<!-- SQL문장을 전송 : SQL문장 어디 있는지 확인 : mapper를 등록 -->
<!-- XML은 문서 저장 : 저장내용이 많아지면 파싱(XML저장되어 있는 데이터를 읽어 간다) 속도가 저하된다:분산 -->
<!-- XML만 가지고 코딩하는 프레임워크 : XML이 길어진다=>속도의 문제 (스트럿츠) : 스프링 -->
<!--
MyBatis => XML없이도 사용이 가능
===== Annotation @
-->
<mappers>
<mapper resource="com/sist/dao/board-mapper.xml"/>
</mappers>
</configuration>
db.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@211.238.142.000:1521:XE
username=hr
password=happy
com.sist.controller
Controller.java
package com.sist.controller;
import java.io.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/////// XML 파싱
import javax.xml.parsers.*;
import org.w3c.dom.*;
//////////////////////////
import com.sist.model.*;
// 연결 (Model <====> JSP)
/*
* Controller 등록 => web.xml
*/
import java.util.*;
public class Controller extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
* 서블릿 동작
* = 메모리 할당 (생성자 호출)
* = init() : 파일 읽기 , 서버연결
* = service() : 사용자가 요청시 처리하는 메소드
* ========= GET/POST ==> 동시에 처리가 가능한 메소드
* GET => doGet()
* POST => doPost()
* = destroy() : 할당된 메모리를 회수한다
*
* == 새로고침,화면이동 ==> destroy() 호출 ==> 메모리 회수
* ========================================== 다시 원상복귀 (새로운 서블릿,JSP 생성)
*
* A a=new A(); ==> destroy() => 메모리는 사라진다
* 새로고침 , 화면이동
* A a=new A(); ==> 새로운 메모리를 다시 만든다 (초기화)
*/
// XML의 데이터를 읽어서 map에 저장 (Controller가 기억하고 있다가 => 요청 => 바로 모델클래스를 찾을 수 있게 한다)
// Callback함수다
// 저장 (모델클래스 저장)
private Map clsMap=new HashMap(); // 키 , 값
public void init(ServletConfig config) throws ServletException {
// web.xml에 등록된 => applicationContext.xml파일을 읽기
// web.xml에 설정된 데이터를 읽어오는 클래스 => ServletConfig
String path=config.getInitParameter("contextConfigLocation");
System.out.println(path);
try
{
// XML읽기
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
// XML을 파싱할 수 있게 클래스 생성
DocumentBuilder db=dbf.newDocumentBuilder(); // 파싱기
// XML , WML , HDML (무선)
// XML 읽어서 메모리에 저장 (저장공간 :Document)
Document doc=db.parse(new File(path));
// 최상위 태그 ==> 트리형태로 저장
Element root=doc.getDocumentElement();
System.out.println(root.getTagName());// <beans>
// bean => 태그 읽기
// bean태그를 묶어서 사용
// 같은 태그를 묶을때 ==> NodeList
NodeList list=root.getElementsByTagName("bean");
/*
* <bean id="list.do" class="com.sist.model.ListModel"/>
<bean id="detail.do" class="com.sist.model.DetailModel"/>
<bean id="insert.do" class="com.sist.model.InsertModel"/>
*/
for(int i=0;i<list.getLength();i++)
{
// bean 읽기
Element bean=(Element)list.item(i);
String cmd=bean.getAttribute("id");
String cls=bean.getAttribute("class");
System.out.println("cmd="+cmd+",class="+cls);
// 저장
// 클래스를 메모리 할당을 한다음에 키,주소
Class clsName=Class.forName(cls);
Object obj=clsName.newInstance(); // 클래스이름을 읽어서 메모리 할당
System.out.println("할당된 주소:"+obj);
// 저장(Map)
clsMap.put(cmd, obj);
}
/*
* XML 파싱 => Spring,Mybatis ==> 파싱 클래스
* SI , SM , 솔루션 , 프레임워크
* ======= ============== xml을 파싱
* 이미 만들어진 클래스 => 제작
*/
}catch(Exception ex){}
}
// 사용자 요청 처리하는 메소드
// Callback함수다
// Callback => 프로그래머가 호출하는 메소드가 아니라 시스템에 위해서 자동 호출되는 메소드
// main()
// 윈도우 => 이벤트 (콜백)
// 프로그래머는 콜백을 함수를 만들 수 없어서 => 반드시 호출을 해야 한다
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 사용자 요청시에 처리가 되는 영역
// http://localhost/OnLineStudy16_MVC1/list.do URL
// 1. 사용자 요청을 받는다
String cmd=request.getRequestURI();// /OnLineStudy16_MVC1/list.do ==> URI
// =================== contextPath
// 2. Model클래스 찾기
cmd=cmd.substring(request.getContextPath().length()+1); // list.do , detail.do
Model model=(Model)clsMap.get(cmd); // if을 사용하지 않아도 된다
// 1,2을 처리하기 위해서 ==> 관련된 데이터를 Map에 저장 ==> clsMap에 저장된 클래스를 찾는다
// 3. Model를 통해서 요청처리 ==> 결과값을 request,session에 담는다
String jsp=model.handlerRequest(request);// 처리후에 request에 값을 담아 준다
// 4. JSP를 찾는다
// 5. JSP로 request를 전송한다
// request를 해당 JSP로 전송하는 클래스 => RequestDispatcher
/*
* Model
*
* ==> return "board/list.jsp"
* ==> return "redirect:list.do" => Spring
*
* insert_ok.jsp ==> list.jsp
* update_ok.jsp
*/
if(jsp.startsWith("redirect"))
{
response.sendRedirect(jsp.substring(jsp.indexOf(":")+1));
// 화면 이동 ==> sendRedirect() => request가 초기화
}
else
{
RequestDispatcher rd=request.getRequestDispatcher(jsp);
rd.forward(request, response);
// 화면 이동 ==> forward ===> request를 전송 => jsp에서 request에 담은 데이터를 받아서 출력
}
}
}
com.sist.dao
BoardVO.java
package com.sist.dao;
import java.util.*;
public class BoardVO {
private int no;
private String name;
private String subject;
private String content;
private String pwd;
private Date regdate;
private int hit;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
}
BoardDAO.java
package com.sist.dao;
import java.util.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.*;
public class BoardDAO {
// 파싱(XML) => SqlSessionFactory
private static SqlSessionFactory ssf;
// 구동하기전에 자동으로 파싱을 한다 => 초기화블럭 (static => static{} , instance => {})
static
{
// 오류 처리 => Mybatis (컴파일 오류(X) => 에러가 발생시에 찾기 어렵다)
try
{
// IO => 파일경로 , 파일명이 틀릴경우에 처리(컴파일예외=>반드시 예외처리를 한다)
// 파일 읽기
Reader reader=Resources.getResourceAsReader("Config.xml");
// MyBatis,Spring => classpath(자동으로 인식하는 경로 : src)
// XML 파싱
ssf=new SqlSessionFactoryBuilder().build(reader);
}catch(Exception ex)
{
ex.printStackTrace();
}
}
/*
* <select id="boardListData" resultType="BoardVO" parameterType="hashmap">
SELECT no,subject,name,regdate,hit,num
FROM (SELECT no,subject,name,regdate,hit,rownum as num
FROM (SELECT no,subject,name,regdate,hit
FROM freeboard ORDER BY no DESC))
WHERE num BETWEEN #{start} AND #{end}
</select>
<select id="boardTotalPage" resultType="int">
SELECT CEIL(COUNT(*)/10.0) FROM freeboard
</select>
*/
// resultType parameterType
public static List<BoardVO> boardListData(Map map)
{
List<BoardVO> list=new ArrayList<BoardVO>();
SqlSession session=ssf.openSession();// Connection얻기
list=session.selectList("boardListData",map);
session.close();//Connection반환
return list;// null
}
public static int boardTotalPage()
{
int total=0;
SqlSession session=ssf.openSession();
total=session.selectOne("boardTotalPage");
session.close();
return total;
}
/*
* <update id="hitIncrement" parameterType="int">
UPDATE freeboard SET
hit=hit+1
WHERE no=#{no}
</update>
<select id="boardDetailData" resultType="BoardVO" parameterType="int">
<!-- public BoardVO boardDetailData(int no) -->
SELECT no,name,subject,content,regdate,hit
FROM freeboard
WHERE no=#{no}
</select>
*/
/*
* CURD
* <select>
* SQL => 1개만 사용 (select문장)
* </select>
* <insert>
* 1개 (insert)
* </insert>
* <update>
* </update>
* <delete>
* </delete>
*
* 단 => 구현한 메소드는 여러개를 동시에 읽어서 처리
*/
public static BoardVO boardDetailData(int no)
{
SqlSession session=ssf.openSession();
// 조회수 증가
session.update("hitIncrement", no);
session.commit();// 정상적으로 저장
// 데이터 읽기
BoardVO vo=session.selectOne("boardDetailData", no);
// 반환
session.close();
return vo;
}
}
board-mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sist.dao.board-mapper">
<select id="boardListData" resultType="BoardVO" parameterType="hashmap">
SELECT no,subject,name,regdate,hit,num
FROM (SELECT no,subject,name,regdate,hit,rownum as num
FROM (SELECT no,subject,name,regdate,hit
FROM freeboard ORDER BY no DESC))
WHERE num BETWEEN #{start} AND #{end}
</select>
<select id="boardTotalPage" resultType="int">
SELECT CEIL(COUNT(*)/10.0) FROM freeboard
</select>
<!-- 상세보기 : 조회수 증가, 게시물 1개를 읽어 온다 (VO)
mybatis에서 태그에 SQL문장은 1번만 사용이 가능
-->
<!-- 조회수 증가 -->
<!--
resultType (X) ==> void
parameterType(매개변수) ==> (int no)
-->
<update id="hitIncrement" parameterType="int">
UPDATE freeboard SET
hit=hit+1
WHERE no=#{no}
</update>
<select id="boardDetailData" resultType="BoardVO" parameterType="int">
<!-- public BoardVO boardDetailData(int no) -->
SELECT no,name,subject,content,regdate,hit
FROM freeboard
WHERE no=#{no}
</select>
</mapper>
com.sist.model
Model.java
package com.sist.model;
import javax.servlet.http.HttpServletRequest;
public interface Model {
// 기능(요청) 처리하는 메소드 => Model의 모든 클래스가 요청을 처리하기 위한 메소드
public String handlerRequest(HttpServletRequest request);// Call By References
// 주소(메모리) ==> 값을 주소에 채워주는 방식 (클래스,배열=>메모리 주소를 이용하는 방식)
/*
* 매개변수 전송 방식 : Call by Value : 다른 메모리에 값을 복사(일반 데이터)
* Call by Reference : 같은 메모리 주소 원본이 넘어간다
*
* MVC 동작 순서
* 브라우저에서 요청을 받는 경우(JSP/Servlet)
* request (request를 받아서) request 데이터베이스 연결
* 사용자 =========== 컨트롤러 ============ Model클래스 ========== 데이터베이스(DAO)
* 결과값을 받는다 request에 값을 담아서 (setAttribute())
* 결과값이 있는 request => 받아서 출력
* ========= Model 클래스 ============== 컨트롤러 ============= JSP로 전송 =========> 사용자
*
* 사용자가 보내준 request를 이용해서 ==> 결과값을 담아 준다 ==> (request는 전체 동일 하다)
* ======================
* Call By Reference
*
* 1) 컨트롤러 : 서블릿 (모델과 뷰를 연결해 주는 역할 수행)
* 2) 모델 : 요청 처리 ==> 확장(재사용) 일반 자바
* 3) 뷰 : 요청 처리된 결과값을 출력 ==> JSP (EL,JSTL)
*
* <%
// 사용자가 보내준 게시물를 받는다
// detail.jsp?no=10
String no=request.getParameter("no");
// DAO 전송
BoardDAO dao=new BoardDAO();
BoardVO vo=dao.boardDetailData(Integer.parseInt(no)); ==> 자바로 구현 (모델)
%>
===================== 모델
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="table.css">
</head>
<body>
<center>
<h1>내용보기</h1>
<table class="table_content" width=700>
<tr>
<th width=20%>번호</th>
<td width=20% align="center"><%=vo.getNo() %></td>
<th width=20%>작성일</th>
<td width=20% align="center"><%=vo.getRegdate().toString() %></td>
</tr>
<tr>
<th width=20%>이름</th>
<td width=20% align="center"><%=vo.getName() %></td>
<th width=20%>조회수</th>
<td width=20% align="center"><%=vo.getHit() %></td>
</tr>
<tr>
<th width=20%>제목</th>
<td colspan="3" align="left"><%=vo.getSubject() %></td>
</tr>
<tr>
<td colspan="4" height="200" valign="top"><pre><%=vo.getContent() %></pre></td>
</tr>
<tr>
<td colspan="4" align="right">
<a href="update.jsp?no=<%=vo.getNo()%>">수정</a>
<a href="#">삭제</a>
<a href="list.jsp">목록</a>
</td>
</tr>
</table>
</center>
</body>
</html>
=================== View
컨트롤러 ==> 연결해야되는 모델과 뷰를 알고 있다 (518~520page)
1) 요청 받는다
String cmd=request.getRequestURI()
=> (list).do
2) 모델을 찾는다 ==> ListModel
3) 모델에서 넘겨준 결과값을 request,session에 담아서
request.setAttribute()
4) JSP를 찾고 => request, session을 넘겨준다
forward(request,responae)
list.do ==> ListModel ====> list.jsp
detail.do ==> DetailModel ===> detail.jsp ==> Map을 이용해서 (요청:키,해당 자바파일)
***** Controller가 수정하기 위해서 Controller를 소스수정 ==> 전체 사이트를 구동할 수 없다
*
* 파일을 이용한다 (.properties,.xml)
* ===== Spring,struts
*
*/
}
DetailModel.java
package com.sist.model;
import javax.servlet.http.HttpServletRequest;
import com.sist.dao.*;
// ==> 게시판 상세보기 처리
public class DetailModel implements Model{
@Override
public String handlerRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
// detail.do?no=1
// request.setParameter("no",1); ==> ==> request.getParameter("no") ==> 1
// 사용자가 보낸 값을 request에 묶어서 넘겨주는 역할 (톰캣)
// service(HttpServletRequest request) => request가 매개변수 ==> 화면이 변경될때마다 request가 초기화
// 1. 사용자 보내준 게시물번호를 받는다
String no=request.getParameter("no");
// 2. BoardDAO를 통해서 게시물 한개를 읽어 온다 (BoardVO) ==> SQL문장 실행 => board-mapper.xml
BoardVO vo=BoardDAO.boardDetailData(Integer.parseInt(no));
// 3. 읽어온 BoardVO값을 jsp로 전송
request.setAttribute("vo", vo);
return "board/detail.jsp";
}
}
InsertModel.java
package com.sist.model;
import javax.servlet.http.HttpServletRequest;
// 글쓰기 요청시 처리
public class InsertModel implements Model{
@Override
public String handlerRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
return "board/insert.jsp";// 화면만 이동
}
}
InsertOkModel.java
package com.sist.model;
import javax.servlet.http.HttpServletRequest;
/*
* list.jsp => HTML만 출력한다 (데이터가 없는 상태)
* list.do => 데이터를 list.jsp로 전송후에 출력
*
* list.jsp
* <%
* list.do
* List<BoardVO> list=BoardDAO.boardListData(); =>ListModel
* %>
* <html>
* <body>
* for(BoardVO vo:list)
* {
* }
* </body>
* </html>
*
* list.jsp ==> 그냥 출력
* request
* list.do ==> Controller ==> ListModel ===> JSP (request에 설정된 데이터를 출력 : ${})
*/
public class InsertOkModel implements Model{
@Override
public String handlerRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
return "redirect:list.do";// 이동 => 목록 ==> list.jsp(X) , list.do
}
}
ListModel.java
package com.sist.model;
import javax.servlet.http.HttpServletRequest;
// 게시판 목록처리 ==>
/*
* <%@ page contentType="text/html;charset=UTF-8" %>
* <%
* 목록처리
* List에 값을 채운다 ==> Model
* %>
* ==============================
* <html>
* <body>
* List를 출력하는 내용
* </body>
* </html>
* ============================== View
*/
import java.util.*;
import com.sist.dao.*;
public class ListModel implements Model{
@Override
public String handlerRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
// 게시물 목록을 가지고 온다 => request에 값을 담아서 JSP로 전송
String page=request.getParameter("page"); // 사용자가 요청한 페이지를 받는다
if(page==null) // 게시판을 실행할때 => 첫페이지
page="1"; //default
int curpage=Integer.parseInt(page);
// 현재 페이지 ==> list목록을 가지고 온다
Map map=new HashMap();
// WHERE num BETWEEN #{start} AND #{end}
// start(시작위치,끝위치) => MyBatis에서 처리
int rowSize=10;
int start=(rowSize*curpage)-(rowSize-1); // rownum은 시작이 1부터
int end=rowSize*curpage;
/*
* 1page ==> 1 AND 10
* 2page ==> 11 AND 20
*/
map.put("start", start);
map.put("end", end);
List<BoardVO> list=BoardDAO.boardListData(map);
int totalpage=BoardDAO.boardTotalPage();
/*
* JSP로 전송해야될 데이터는 3개 (현재페이지,총페이지 , list목록)
*/
request.setAttribute("list", list);
request.setAttribute("curpage", curpage);
request.setAttribute("totalpage", totalpage);
// 여기서 전송된 것이 아니라 ==> Controller에서 request를 받아서 전송
/*
* 사용자 요청 ====> Controller ===> Model ===== BoardDAO
* Model ==== Controller ===> JSP
*/
return "board/list.jsp";// 어떤 JSP로 request를 보낼것인지
}
}
WebContent
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.sendRedirect("list.do");
// JavaScript : location.href="list.do"
%>
WEB-INF/
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- applicationContext.xml
사용자 요청 => list.do
=> ListModel클래스를 찾을 수 있게 만든다 (매칭)
Model클래스 등록 => Controller가 찾아서 요청 처리가 가능하게 만드는 파일
-->
<beans><!-- 스프링 Bean(Model클래스) -->
<bean id="list.do" class="com.sist.model.ListModel"/>
<bean id="detail.do" class="com.sist.model.DetailModel"/>
<bean id="insert.do" class="com.sist.model.InsertModel"/>
<bean id="insert_ok.do" class="com.sist.model.InsertOkModel"/>
<!--
map.put("list",new ListModel())
-->
</beans>
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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>OnLineStudy16_MVC1</display-name>
<!-- Servlet 등록 -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>com.sist.controller.Controller</servlet-class>
<!--
Controller가 읽어갈 XML의 위치 저장
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/Users/yongpro/Desktop/JAVA1/HelloWorld/OnLineStudy16_MVC1/WebContent/WEB-INF/applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<!-- URL주소에 파일명 없이 자동 실행이 가능하게 만든다 : 등록된 파일만 가능 (추가해서 사용이 가능) -->
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>main.jsp</welcome-file>
<!-- 추가 -->
</welcome-file-list>
</web-app>
board/
detail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
margin: 0px auto; /*가운데 정렬*/
width:700px;
}
h1 {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<h1>내용보기</h1>
<table class="table table-striped">
<tr>
<th class="text-center danger" width=20%>번호</th>
<td class="text-center" width=30%>${vo.no }</td>
<th class="text-center danger" width=20%>작성일</th>
<td class="text-center" width=30%>
<fmt:formatDate value="${vo.regdate }" pattern="yyyy/MM/dd"/>
</td>
</tr>
<tr>
<th class="text-center danger" width=20%>이름</th>
<td class="text-center" width=30%>${vo.name }</td>
<th class="text-center danger" width=20%>조회수</th>
<td class="text-center" width=30%>${vo.hit }</td>
</tr>
<tr>
<th class="text-center danger" width=20%>제목</th>
<td class="text-left" colspan="3">${vo.subject }</td>
</tr>
<tr>
<td class="text-left" colspan="4" valign="top" height="200">
<pre style="white-space: pre-wrap;border: none;background-color: white">${vo.content }</pre>
</td>
</tr>
<tr>
<td colspan="4" class="text-right">
<a href="update.jsp?no=${vo.no }" class="btn btn-xs btn-success">수정</a>
<a href="delete.jsp?no=${vo.no }" class="btn btn-xs btn-info">삭제</a>
<a href="list.jsp" class="btn btn-xs btn-warning">목록</a>
</td>
</tr>
</table>
</div>
</div>
</body>
</html>
insert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
margin: 0px auto; /*가운데 정렬*/
width:700px;
}
h1 {
text-align: center;
}
</style>
</head>
<body>
<div class="row">
<h1 class="text-center">글쓰기</h1>
<form method="post" action="insert_ok.do">
<table class="table table-hover">
<tr>
<th class="danger text-right" width=15%>이름</th>
<td width=85%>
<input type=text name=name size=15 class="input-sm">
</td>
</tr>
<tr>
<th class="danger text-right" width=15%>제목</th>
<td width=85%>
<input type=text name=subject size=45 class="input-sm">
</td>
</tr>
<tr>
<th class="danger text-right" width=15%>내용</th>
<td width=85%>
<textarea rows="10" cols="50" name=content></textarea>
</td>
</tr>
<tr>
<th class="danger text-right" width=15%>비밀번호</th>
<td width=85%>
<input type=password name=pwd size=10 class="input-sm">
</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<input type=submit value=글쓰기 class="btn btn-sm btn-primary">
<input type=button value=취소 class="btn btn-sm btn-primary"
onclick="javascript:history.back()"
>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%--
request.getParameter() : 사용자가 요청한 데이터
request.setAttribute() => request.getAttribute()
================================================
사용자가 요청한 데이터 외에 다른 데이터 추가해서 사용
=> id , pwd 로그인 ===> 서버에서는 개인정보 여러개 추가
name , 주소
--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">자유게시판</h1>
<table class="table">
<tr>
<td>
<a href="insert.do" class="btn btn-sm btn-primary">새글</a>
</td>
</tr>
</table>
<table class="table table-striped">
<tr class="danger">
<th class="text-center" width=10%>번호</th>
<th class="text-center" width=45%>제목</th>
<th class="text-center" width=15%>이름</th>
<th class="text-center" width=20%>작성일</th>
<th class="text-center" width=10%>조회수</th>
</tr>
<c:forEach var="vo" items="${list }">
<tr>
<td class="text-center" width=10%>${vo.no }</td>
<td class="text-left" width=45%>
<a href="detail.do?no=${vo.no }">${vo.subject }</a>
</td>
<td class="text-center" width=15%>${vo.name }</td>
<td class="text-center" width=20%>
<fmt:formatDate value="${vo.regdate }" pattern="yyyy-MM-dd"/>
</td>
<td class="text-center" width=10%>${vo.hit }</td>
</tr>
</c:forEach>
</table>
<table class="table table-striped">
<tr>
<td class="text-right">
<a href="list.do?page=${curpage>1?curpage-1:curpage }" class="btn btn-sm btn-danger">이전</a>
${curpage } page / ${totalpage } pages
<a href="list.do?page=${curpage<totalpage?curpage+1:curpage }" class="btn btn-sm btn-primary">다음</a>
</td>
</tr>
</table>
</div>
</div>
</body>
</html>
'Back-end > JSP' 카테고리의 다른 글
JSP 9일차 - Controller.jar, 사이트 제작 (0) | 2020.10.14 |
---|---|
JSP 8일차 - Annotation (0) | 2020.10.13 |
JSP 6일차 - MVC / 인터페이스 (0) | 2020.10.08 |
JSP 5일차 - JSTL / 망고플레이트 (0) | 2020.10.07 |
JSP 4일차 - Express Language, JSTL / 게시판 (2) | 2020.10.05 |