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는 용량이 고정되어 있지 않으므로 새로운 객체를 생성하지 않음
- StringBuffer 와 StringBuilder 의 차이점
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);
}
}
'코딩도전기 > MVC' 카테고리의 다른 글
CODO Day23~24_JAVA_MVC(Collection Framework - ArrayList/Vector) (0) | 2023.03.06 |
---|---|
CODO Day23_JAVA_MVC(Exception) (0) | 2023.03.06 |
CODO Day20~21_JAVA_MVC(추상화의 장점/다형성) (0) | 2023.02.28 |
CODO Day19_JAVA_MVC(Interface 다중 구현/익명객체/Interface 상속) (0) | 2023.02.27 |
CODO Day18_JAVA_MVC(Abstract(추상화)) (0) | 2023.02.24 |