- jsp로 do 를 못 불러옴 (include file로 로드를 못함) : java가 더 상위의 언어이기때문
1. include .do파일을 로드 할 수 있을까? (X)
1-1. do 에서 include?? (X)
1-2 do 에서 jsp 로 include 해서 여러개의 페이지를 로드는 할 수 있음
2. ajax 데이터 통신
- do 통신을 할 경우 결과에 대해서만 write (배열, 문자열, 결과값)
- jsp 통신을 할 경우
session 을 배열형태로 만들면 메모리를 적게 먹음
do 에서는 jsp를 단 한개만 로드할 수 있음
top session 배열data를 로드
<%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% HttpSession se = request.getSession(); ArrayList<String> al = new ArrayList<String>(); al.add("hong"); al.add("홍길동"); al.add("hong@nate.com"); se.setAttribute("user",al); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>top session 배열data를 생성</title> </head> <body> <input type="button" value="전송" onclick="location.href='./page2.jsp'"> </body> </html>
- jsp 로 배열을 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% HttpSession se = request.getSession(); //문법에서는 문제 없는것 같지만 500번 에러 발생함 String data=(String) se.getAttribute("user"); //user 는 배열이어서 String으로 못 받음 %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>top session 배열data를 로드</title> </head> <body> </body> </html>
-> 배열로 받으면 오류발생 X
<%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% HttpSession se = request.getSession(); //배열로 출력 ArrayList data=(ArrayList) se.getAttribute("user"); //user 는 배열이어서 String으로 못 받음 out.print(data); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>top session 배열data를 로드</title> </head> <body> </body> </html>
-배열로 받아서 출력 가능함
page2.jsp에서 출력되는 세션 값 및 page4.do에 있는 값도 출력
page4.java : page3.jsp 로 보냄
//page3.jsp load 및 데이터 전달 public class page4 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String room = "조선호텔"; String room_info = "중앙 402호"; request.setAttribute("room", room); request.setAttribute("room_info", room_info); RequestDispatcher rd = request.getRequestDispatcher("./page3.jsp"); rd.forward(request, response); } }
page2.jsp (page1.jsp 에서 만든 배열을 가져옴) 을 page 3.jsp 에서 로드<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="./page2.jsp" %> <% out.print(request.getAttribute("room")); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>page2에서 출력되는 세션 값 및 page4.do에 있는 값도 출력</title> </head> <body> <%=request.getAttribute("room_info") %> </body> </html>
ajax로 java에 바로 던져서 출력
● ajax로 do에 데이터 전송 (ajax1.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> </head> <body> <select onchange="infodata(this.value)"> <option value="data1">데이터1</option> <option value="data2">데이터2</option> <option value="data3">데이터3</option> </select> <div id="dataload"> 데이터 출력 </div> </body> <script> function infodata(z) { var http, result; http = new XMLHttpRequest(); http.onreadystatechange = function() { if(http.readyState==4 && http.status==200){ console.log(this.response); } } http.open("post","./ajax2.do",true); http.setRequestHeader("content-type","application/x-www-form-urlencoded"); http.send("idx="+z); } </script> </html>
do에서 받아서 다시 ajax1.jsp 콘솔로 출력
public class ajax2 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //콘솔로 찍어내기위한 printwriter PrintWriter pw = response.getWriter(); String idx = request.getParameter("idx"); //System.out.println(idx); pw.write(idx); pw.close(); } }
출력 결과
select의 value값을 do로 전송 한 후 do에서 핸들링해서 다시 console에 찍음
-> select 를 바꿀 때 마다 데이터가 날아감
ajax통신으로 do에서 배열로 만든것을 printwriter로도 데이터를 전송할 수 있음
● ajax로 호출 시 RequestDispatcher는 작동하지 않기 때문에 printwirter로 핸들링 하는 수 밖에 없음
( RequestDispatcher는 form 이나 location.href 로만 작동함 )
printwriter를 이용해 script로 배열 전송 (스크립트 태그까지 출력되는 문제 발생)
public class ajax2 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); //db를 select => 20번 이상 통신하면 뻗어버림 : select 자주하면 안됨 String data1 = "신라호텔"; String data2 = "방1,주방1,거실1,화장실1"; String data3 = "16800"; StringBuffer sb = new StringBuffer(); sb.append(data1+"|"); sb.append(data2+"|"); sb.append(data3); System.out.println(sb); PrintWriter pw = response.getWriter(); String idx = request.getParameter("idx"); pw.write("<script>" + "var db = new Array();" + "db.push("+data1+");" + "db.push("+data2+");" + "db.push("+data3+");" + "</script>"); pw.write("ok"); pw.close(); } }
● <script>를 출력안되게, 배열 데이터만 출력하는 방법
- backend 에서 자바스크립트 로 핸들링, front 에서 eval로 받아 출력
do 에서 pw로 <script>없이 이렇게 던져야함.
- eval로 front-end 에서 받을 시 script 태그를 사용하지 않는다.public class ajax2 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); String data1 = "신라호텔"; String data2 = "방1,주방1,거실1,화장실1"; String data3 = "16800"; PrintWriter pw = response.getWriter(); String idx = request.getParameter("idx"); pw.write("var data = new Array(); " + "data.push('"+data1+"');" + "data.push('"+data2+"');" + "data.push('"+data3+"');"); pw.close(); } }
jsp 에서 ajax로<%@ 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> </head> <body> <select onchange="infodata(this.value)"> <option value="data1">데이터1</option> <option value="data2">데이터2</option> <option value="data3">데이터3</option> </select> <div id="dataload"> 데이터 출력 </div> </body> <script> function infodata(z) { var http, result; http = new XMLHttpRequest(); http.onreadystatechange = function() { if(http.readyState==4 && http.status==200){ eval(this.response); //console에 response 받은것 다 출력 console.log(data); } } http.open("post","./ajax2.do",true); http.setRequestHeader("content-type","application/x-www-form-urlencoded"); http.send("idx="+z); } </script> </html>