본문 바로가기
코딩도전기/MVC

CODO Day22_JAVA_MVC(String)

by 코도꼬마 2023. 3. 6.

String(문자열)

  • Programming에서 문자열은 다루는 것은 byte와 char가 유일
  • 본래 문자열(string)은 char의 배열(array)
  • String 은 char 배열을 다루기 위한 class
  • char a = 'a';  /  String a = "a";
  • Char[] a = a b c d  //  String a = “abcdefg”;
public class HomeController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		//문자열 만드는 방식 1
		String str = "Hello String";
		
		//문자열 만드는 방식 2
		str = new String("Hello String2");
		
		//문자열 만드는 방식 3
		char[] alphabet = {'H','e','l','l','o',' ','S','t','r','i','n','g','3'};
		str = new String(alphabet);
	}
}

 

 

문자열(String) 의 기능들

equals() 두 문자가 같은지 비교
contains() 해당 문자를 포함하는지 비교(boolean)
replace() 특정 문자를 변경
trim() 문자의 앞뒤 공백을 제거
startWith() 특정 문자열로 시작하는지 여부 확인
endWith() 특정 문자열로 끝나는지 여부 확인
length() 문자열 길이 확인
charAt() 특정 인덱스의 문자 확인
indexOf() 특정 문자가 있는 인덱스 확인(1개)
substring() 문자열 특정 부분 잘라 냄
toCharArray() 문자열을 캐릭터 배열로 변환
split() 문자열을 특정 구분자로 나눠 줌

 

String

  • 용량이 고정되기 때문에 문자열 추가 시(+=) 새로운 객체를 계속 생성함

 

StringBuffer VS StringBuilder

 

  • StringBuffer와 StringBuilder는 용량이 고정되어 있지 않으므로 새로운 객체를 생성하지 않음

 

  • StringBufferStringBuilder 의 차이점
  String StringBuffer StringBuilder
용량 초기화 시 지정한 값 가변적 가변적
문자열 추가 시 새로운 객체 생성 새로운 객체 생성하지 않음 새로운 객체 생성하지 않음
다수유저 동시 접근   허용하지 않음 허용함

 

  • StringUtils(model역할)(코드리뷰)
package kr.co.web.model;

public class StringUtils {
	
	public String check(String fileName) {
		//파일명은 20자가 넘으면 안됩니다.
		
		//매개변수로 들어온 fileName의 길이를 len 변수를 선언해 담아주었습니다. 
		int len = fileName.length();
		//System.out.println("글자수 : " + len);
		
//len의 값이 20이상일 경우 아래의 리턴값을 반환하고 넘지 않을 경우 다음 함수로 넘어갑니다.
		if(len>20) {
			return fileName + "은 20자가 넘습니다.";
		}		
		
        
		//파일명에 다음 문자가 있어서는 안됩니다.(@,$,#,%,&)
		
		//String타입의 arr배열을 선언하여 다음과 같이 담아주었고
		String[] arr = {"@","$","#","%","&"};
		
		//향상된 for문을 사용하여 arr배열의 값을 하나씩 꺼내 str에 담아줍니다.
		for(String str : arr) {
			
			//특정 문자가 포함되었는지 true|false로 나타냄
//boolean타입의 contains 변수를 선언하여 fileName에 str의 값을 담고 있으면 true, 
  없으면 false를 담도록 해줍니다.
			boolean contains = fileName.contains(str); 
			
//contains변수가 true값이면 다음 내용을 리턴하고, false이면 다음 함수로 넘어갑니다.
			if(contains == true) {
				return "파일명에 (@,$,#,%,&)이 포함되어서는 안됩니다.";
			}
		}	
		
        
		//파일명 앞에 [img]를 붙여야합니다.
		//startsWith() : 대상 문자 앞에 특정 문자로 시작되는지 true|false로 나타냄
		
//fileName이 [img]로 시작하지 않을 경우 다음 내용을 리턴하고, true이면 다음 함수로 넘어갑니다.
		if(fileName.startsWith("[img]") == false) {
			return "파일명 앞에 [img]를 붙이세요";
		}	
		
        
		//허용되는 확장자는 .png .jpg .gif (jpeg)입니다.
		
		//exts라는 배열을 선언해 다음 값들을 넣어주고
		String[] exts = {".png",".jpg",".gif",".jpeg"};
		
		//boolean 변수 pass를 선언하여 false값을 넣어주었습니다.
		boolean pass = false;
		
		//향상된 for문을 사용하여 exts의 값을 하나씩 꺼내 ext변수에 담아주고
		for(String ext : exts) {
			
//fileName의 ext변수의 담긴 문자열로 끝나는지 비교해주어 true|false 값을 pass변수에 담았고
			pass = fileName.endsWith(ext);
			
			//pass값이 true이면 다음 함수로 넘어가도록 break문을 걸어주었습니다.
		//pass가 true값이 나오면 더이상 비교를 진행하지 않도록 break문을 걸어주었습니다.
			if(pass) {
				break;
			}
		}		
		//false가 나오면 다음 내용을 리턴합니다.
		if(!pass) {
			return "허용된 확장자는 (.png .jpg .gif .jpeg) 입니다.";			
		}	
		
        
		//.jpeg확장자의 경우는 강제로 .jpg로 변환됩니다.	
		
		//fileName이 .jpeg 문자열로 끝날 경우 
		if(fileName.endsWith(".jpeg") == true) {
			//fileName의 ".jpeg" 값을 ".jpg"으로 변경해준 후
			fileName = fileName.replace(".jpeg", ".jpg");
		}  //다음 내용을 리턴합니다.		
		return fileName + "는 정상적인 파일명입니다.";		
	}


	public Object search(String text, String val) {
		
		//전체 text를 소문자로 변경
		String lowerText = text.toLowerCase();
		
		//indexOf를 통해 a의 위치 반환
		//1개만 찾아줌(원하는 인덱스 번호를 반환, 못 찾으면 -1 반환)
		
        //StringBuffer 사용
		  int idx = lowerText.indexOf(val); 
		  //String result = "a의 인덱스["+idx+"] ";
		  StringBuffer buffer = new StringBuffer("a의 인덱스 ["+idx+"] ");
		  
		  while(idx > -1) {		  
			  idx = lowerText.indexOf(val, idx+1);			  
			  if(idx < 0) {
				  break;
			  }			  
			  //result += "["+idx+"] "; 	
			  buffer.append("["+idx+"] ");
		  }
		return buffer;		
	}	
}

 

  • index.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>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style>
	table, th, td{
	border: 1px solid black;
	border-collapse: collapse;
	padding: 5px 10px;
	}
</style>
</head>
<body>
	<form action="login" method="post">
		<table>
			<tr>
				<th>ID</th>
				<td><input type="text" name="id"/></td>
			</tr>
			<tr>
				<th>PW</th>
				<td><input type="password" name="pw"/></td>
			</tr>
			<tr>
				<th colspan="2"><button>LOGIN</button></th>
			</tr>
		</table>
	</form>
	<a href="utils.jsp">utils 확인</a>
</body>
<script>
	var msg = '${msg}';
	
	if(msg != ''){
		alert(msg);
	}
</script>
</html>

 

  • HomeController
package kr.co.web.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/login")
public class HomeController extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {

		String id = req.getParameter("id");
		String pw = req.getParameter("pw");
		System.out.println(id + " / " + pw);
		
		//회원들이 실수로 앞또는 뒤에 공백을 넣을 경우 처리
		id = id.trim();
		pw = pw.trim();
		System.out.println(id + " / " + pw);
		
		String page = "index.jsp"; 
		String msg = "아이디 또는 비밀번호를 확인하세요!";
		
		//id가 admin이고, pw가 pass면 로그인 수락, 아니면 index.jsp로 이동
		if(id.equals("admin") && pw.equals("pass")) {
			HttpSession session = req.getSession();
			session.setAttribute("loginId", id);
			page = "main.jsp";
			msg = id + "님 반갑습니다.";
		}		
		req.setAttribute("msg", msg);
		RequestDispatcher dis = req.getRequestDispatcher(page);
		dis.forward(req, resp);		
	}	
}

 

  • main.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>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
</head>
<body>
	<h3>파일명 주의사항</h3>
	<ol>
		<li>파일명은 20자가 넘으면 안됩니다.</li>
		<li>파일명에 다음 문자가 있어서는 안됩니다.(@,$,#,%,&)</li>
		<li>파일명 앞에 [img]를 붙여야 합니다.</li>
		<li>허용되는 확장자는 .png .jpg .gif 입니다.</li>
		<li>.jpeg확장자의 경우는 강제로 .jpg로 변환됩니다.</li>
	</ol>
	<form action="upload" method="post">
		파일명 검사 : <input type="text" name="fileName" value="[image]test@image.jpeg"/>
		<button>전송</button>
	</form>	
</body>
<script>
	var msg = '${msg}';
	if(msg != ''){
		alert(msg);
	}
</script>
</html>

 

  • UploadController(코드리뷰)
package kr.co.web.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.web.model.StringUtils;

@WebServlet("/upload")
public class UploadController extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		//main.jsp에서 fileName을 이름으로 갖는 파라메터를 가져왔습니다.
		String fileName = req.getParameter("fileName");
		//System.out.println(fileName);
		
		//StringUtils 클래스의 매서드를 사용하기 위해 객체화해주고
		StringUtils utils = new StringUtils();
		
//파라메터로 받아온 fileName 값을 객체화한 utils의 check메소드의 매개변수로 넣어 주었고
//check메서드를 실행하여 받은 리턴값을 result변수를 선언하여 담아주었습니다.
		String result = utils.check(fileName);
		
		req.setAttribute("msg", result);
		RequestDispatcher dis = req.getRequestDispatcher("main.jsp");
		dis.forward(req, resp);		
	}
}

 

  • utils.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
</head>
<body>
	<h3>My First Program Language is JAVA</h3>
	<a href="utils?action=charAt&val=4">4번째 인덱스 값은?</a>
	<c:if test="${charAt ne null}">
		<p>답 : ${charAt}</p>	
	</c:if>
	<hr/>
	
	<a href="utils?action=substring&val=Language">Language만 남기고 다 없애기</a>
	<c:if test="${substring ne null}">
		<p>답 : ${substring}</p>	
	</c:if>
	<hr/>
	
	<a href="utils?action=toCharArray">문자열을 캐릭터 배열로 만들기</a>
	<c:if test="${toCharArray ne null}">
		<p>답 : 
			<c:forEach items="${toCharArray}" var="ch">
				[${ch}]
			</c:forEach>
		</p>	
	</c:if>
	
	<hr/>
	
	<a href="utils?action=split">공백 단위로 문자열 분리하기</a>
	<c:if test="${split ne null}">
		<p>답 : 
		<c:forEach items="${split}" var="sp">
				[${sp}]
			</c:forEach>
		</p>	
	</c:if>
	
	<hr/>
	
	<a href="utils?action=indexOf&val=a">a가 있는 인덱스 번호 찾기</a>
	<c:if test="${indexOf ne null}">
		<p>답 : ${indexOf}</p>	
	</c:if>
	<hr/>
</body>
<script></script>
</html>

 

  • UtilsController
package kr.co.web.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.web.model.StringUtils;

@WebServlet("/utils")
public class UtilsController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {

		String action = req.getParameter("action");
		String val = req.getParameter("val");
		//System.out.println(action + " / " + val);
		Object result = null;
		String text = "My First Program Language is JAVA";

		switch (action) {
		case "charAt":
			//4번 인덱스에 있는 문자는?
			result = text.charAt(Integer.parseInt(val));
			break;

		case "substring":
			//17인덱스부터 보여주고, 25인덱스부터 잘라내라
			result = text.substring(17, 25);
			break;

		case "toCharArray":
			result = text.toCharArray();
			
			break;

		case "split":
			result = text.split(" ");
			break;
            
		case "indexOf":
			StringUtils utils = new StringUtils();
			result = utils.search(text,val);
			break;
		}
		req.setAttribute(action, result);
		RequestDispatcher dis = req.getRequestDispatcher("utils.jsp");
		dis.forward(req, resp);
	}
}