한글 깨짐 해결하기 (.jsp 파일에 추가) jsp 한글, jsp 한글 깨짐, 자바 한글, 자바 한글 깨짐, java 한글, java 한글 깨짐
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
C 태그 사용하기 (.jsp 파일에 추가)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
jQuery 추가하기 jquery Jqeury
<link rel="stylesheet" href="fontawesome-free-5.10.1-web/css/all.min.css" />
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
Sqlite , JSON 설치하기 dependency (pom.xml 파일에 추가)
<!-- SQLite -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.27.2.1</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
단축키
Option + Space (윈도우에서는 Ctrl + Space) : 자동완성
Command + Shift + 'O' (윈도우에서는 Ctrl + Shift + 'O') : 자동 임포트
Command + '/' (윈도우에서는 Ctrl + '/' ) : 주석
Command + 'F' : 찾기
Control + 'H' : 검색
sysout + 자동완성 : System.out.println(); 이 자동으로 타이핑 된다.
cf. Preferences -> Templates 검색 -> 여기 가면 다양한 자동완성 탬플릿이 있다. 만약 필요하다면 추가하고, 안 쓰는게 자꾸 자동완성 된다면 꺼버리자.
Command + Option + 'R' : 프로젝트나 클래스 이름 변경. (우클릭 -> Refactor -> Rename 과 같다.)
Command + Option + 'V' : 자바 파일 이동. (그냥 드래그 앤 드랍으로 다른 프로젝트로 옮기면 작동 안 한다.)
자료형 및 기본 문법
int, long : 정수 / Integer : 정수 (int는 단순 자료형으로 객체가 아니고, Integer는 클래스로 객체다.)
float, double : 실수
String, char : 문자열, 문자 (전부 소문자로 시작하는데 문자열만 대문자로 시작한다. 문자열은 쌍따옴표, 문자는 따옴표)
boolean : 참/거짓
자료형 변수명 = 값; 형태로 쓴다. i.e. int age = 25;
자료형 배열명[] = {값1,값2,값3...}; 형태로 쓴다. i.e. int score[] = {80,70,90,100,60,80,90,70};
자료형 []배열명 = {값1,값2,값3...}; 형태도 가능하다. i.e. int[] score = {80,70,90,100,60,80,90,70};
new : 초기화, 인스턴스 생성, 포맷 -> 메모리 주소를 할당한다는거다. 사용하도록 하겠다.
ABC.split("K") : ABC라는 변수가 가진 문자열을 문자열 "K"로 분리해서 배열로 만든다.
ABC.replace("abc","def") : ABC라는 변수가 가진 문자열을에서 "abc" 를 "def"로 치환 한다.
ABC.split(K) : ABC라는 변수가 가진 문자열을 K라는 변수가 가진 문자열로 분리해서 배열로 만든다.
ABC.substring(3,6) : ABC라는 변수가 가진 문자열에서 인덱스 3:6을 뽑아낸다.
상속
main() 메소드가 있는 클래스 : 실행 클래스. 해당 패키지 내에서 프론트엔드에 해당하는 부분.
main() 메소드가 없는 클래스 : 함수 클래스. 해당 패키지 내에서 백엔드에 해당하는 부분.
public 클래스명() : 클래스명을 메소드 이름으로 갖는 메소드 -> 생성자(초기값 설정).
public void 메소드명() : return이 없는 메소드.
public int 메소드명() : return 타입이 int인 메소드.
클래스명 extends 클래스명 : 클래스명을 Super 클래스로 갖는 클래스명(Sub 클래스)
클래스명 : Sub 클래스
클래스명 : Super 클래스
클래스명 implements 인터페이스명 : 인터페이스명을 규약을 통해 참조하는 클래스명
형변환
(int)123.456
(double)20
Integer.parseInt(ABC) : ABC를 숫자로 형변환.
Integer.toString(123) : 123을 문자로 형변환.
(Integer만 Double로 바꿔서 응용 가능하다.)
ABC.equals("DEF") : ABC의 문자열이 "DEF"와 같으면 true, 다르면 false (자세한거는 하단의 '기타'를 참고).
반올림 / 올림 / 내림 Math 이용
public class RoundTest {
public static void main(String[] args) {
double ABC = 1234.56789;
// 곱하기 몇을 하면, 나누기 몇을 하면 몇의 자리니 하는 식으로 생각하지 말고 소수점을 좌우로 밀고 당겨 반올림 하고 원래대로 밀고 당겨 복원시킨다는 개념으로 이해하자.
// 반올림
System.out.println(Math.round(ABC)); // 결과 : 1235
System.out.println(Math.round(ABC / 100) * 100); // 결과 : 1200
System.out.println(Math.round(ABC / 1000) * 1000); // 결과 : 1000
System.out.println(Math.round(ABC * 100) / 100.0); // 결과 : 1234.57 (반드시 100.0으로 나눠야한다. 안 그러면 소수점 아래가 날아감.)
System.out.println(Math.round(ABC * 1000) / 1000.0); // 결과 : 1234.568
System.out.println("");
// 올림
System.out.println(Math.ceil(ABC)); // 결과 : 1235.0
System.out.println(Math.ceil(ABC / 100) * 100); // 결과 : 1300.0
System.out.println(Math.ceil(ABC / 1000) * 1000); // 결과 : 2000.0
System.out.println(Math.ceil(ABC * 100) / 100.0); // 결과 : 1234.57
System.out.println(Math.ceil(ABC * 1000) / 1000.0); // 결과 : 1234.568
System.out.println("");
// 내림
System.out.println(Math.floor(ABC)); // 결과 : 1234.0
System.out.println(Math.floor(ABC / 100) * 100); // 결과 : 1200.0
System.out.println(Math.floor(ABC / 1000) * 1000); // 결과 : 1000.0
System.out.println(Math.floor(ABC * 100) / 100.0); // 결과 : 1234.56
System.out.println(Math.floor(ABC * 1000) / 1000.0); // 결과 : 1234.567
}
}
자릿수 맞춤 String.format 이용
배열
int ABC[] = new int[10] : 비어있는 공간 10개짜리 빈 배열을 선언하고 초기화.
int ABC[] : 배열을 선언만 하고 초기화는 하지 않음. (나중에 ABC = new int[10] 으로 공간을 만들어 초기화 할 수 있다.)
int ABC[] = DEF : int DEF[] = {......} 배열을 ABC 배열에 복사한다. 뒤에는 DEF[]로 쓰지 않는다.
ABC.length : ABC 배열의 길이를 반환.
Arrays.toString(ABC) : ABC 배열을 레퍼런스(메모리 주소값)이 아닌 파이썬 리스트 형태로 출력.
Arrays.sort(ABC) : ABC 배열을 오름차순 정렬(숫자, 영문, 한글 모두 가능)
Arrays.sort(ABC, Comparator.reverseOrder()) : ABC 배열을 내림차순 정렬 (정수는 반드시 Integer로 선언해줘야 한다. int는 오류남.)
Arrays.sort(ABC, Collections.reverseOrder()) : 위와 동일하다. 정수는 Integer 필요함.
Arrays.stream(ABC).sum() : ABC 배열의 합을 구함.
함수
스캐너 Scanner (입력 받기)
import java.util.Scanner; // 임포트 스캐너 라이브러리
Scanner s = new Scanner(System.in); // int a 처럼. 스캐너 s를 ~로 선언해라 = 새로운 스캐너 값(시스템으로 들어온)으로
int userInputNumber = s.nextInt(); // 스캐너를 이용해 . Int( )로 넘겨라
double userInputNumber = s.nextDouble(); // 스캐너를 이용해 . Double( )로 넘겨라
String userInputWord = s.next(); // 스캐너를 이용해 . 넘겨라
String userInputSentence = s.nextLine(); // 스캐너를 이용해 . 문장으로 넘겨라
import java.util.Scanner;
public class scanner review {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
System.out.print(line);
}
}
입력 : 학교 종이 땡땡땡
출력 : 학교 // 띄어쓰기가 나오면 종료되어 뒤에는 입력을 받지 못해서 그렇다.
import java.util.Scanner;
public class homework_revieew {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String word = scanner.next();
System.out.print(word);
}
}
입력 : 학교 종이 땡땡땡
출력 : 학교 종이 땡땡땡
------------------------------------------------------------
랜덤 Rnadom (입력 받기)
import java.util.Random; // 임포트 랜덤 라이브러리
Random r = new Random(); // 랜덤 r을 ~로 선언해라 = 새로운 랜덤 값으로
int lotto = r.nextInt(); // 랜덤을 이용해 . Int( )로 넘겨라
int dice = r.nextInt(6); // 랜덤을 이용해 . Int(6 이전)으로 넘겨라
import java.util.Random;
public class random review {
public static void main(String[] args) {
Random r = new Random();
int dice = r.nextInt(6);
System.out.println(dice + 1);
}
}
결과 :
6 미만의 수 0, 1, 2, 3, 4, 5가 실행할 때마다 랜덤으로 나온다.
따라서 +1을 해줬으니 1~6의 수가 랜덤으로 출력된다.
------------------------------------------------------------
foreach문
for (int value:ABC) { // ABC 배열이 int이기 때문에 int value:ABC가 된다.
value를 변수로 사용하는 로직 구성. i.e. System.out.println(value);
}
for ( 자료형 value:ABC ) {
value를 변수로 갖는 로직
}
형태로 쓴다. 자료형은 ABC 배열의 자료형을 말하며, value는 각각의 값을 꺼내오란 의미다. 즉, ABC 배열에 하나씩 접근해! 라는 뜻이다.
여기서 value는 ABC 배열의 각각의 값이 된다.
2020/04/05 - [개발자/Java] - Java (자바) 배열과 레퍼런스에 가서 파이썬이나 스위프트처럼 배열을 모두 출력하기 를 참고하자.
Java (자바) 배열
1. 배열 선언하기 & 래퍼런스 자바의 배열을 선언하는 방법은 두 가지로 나뉜다. 자료형 배열명[] = {값1,값2,값3...}; 형태로 쓴다. i.e. int score[] = {80,70,90,100,60,80,90,70}; 자료형 []배열명 = {값1,값2..
greendreamtrre.tistory.com
기타
문자 비교연산
자바에서는 문자를 == 로 비교연산 할 수 없다.
String ABC = "Hello"; 가 있을 경우 "Hello"가 맞는지 비교연산을 하고싶다면 다음과 같이 한다.
ABC.equals("Hello") : true
ABC.equals("Hi") : false
변수명.equals("문자열") 로 == 비교연산을 대신한다.
Spring
@RequestMapping 기본 폼
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
return "home";
}
@RequestMapping(value = "/signup", method = RequestMethod.GET)
public String signup(Locale locale, Model model) {
return "signup";
}
@RequestMapping(value = "/signin", method = RequestMethod.GET)
public String signin(Locale locale, Model model) {
return "signin";
}
DataReader.java 기본 폼
import java.sql.Connection;
import java.sql.DriverManager;
import org.sqlite.SQLiteConfig;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DataReader {
private Connection connection;
private String dbfileName;
private String dbTableName;
static {
try {
Class.forName("org.sqlite.JDBC");
}catch (Exception e) {
e.printStackTrace();
}
}
public DataReader(String databaseFileName, String dbTableName) {
this.dbfileName = databaseFileName;
this.dbTableName = dbTableName;
}
public boolean open() {
try {
SQLiteConfig config = new SQLiteConfig();
this.connection = DriverManager.getConnection("jdbc:sqlite:/" +
this.dbfileName, config.toProperties());
}catch(SQLException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean close() {
if(this.connection == null) {
return true;
}
try {
this.connection.close();
}catch(SQLException e) {
e.printStackTrace();
return false;
}
return true;
}
}
SHA-256 암호화
dataReader.open(); // DataReader를 연다.
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256"); // SHA 알고리즘 클래스 호출.
byte[] hash = digest.digest(password.getBytes("UTF-8")); // 암호화 할 데이터를 "UTF-8"로 읽어 위에서 만든 알고리즘을 이용해 해쉬를 한다.
StringBuffer hexString = new StringBuffer(); // 문자열을 잠시 담기 위한 버퍼 호출.
// 해쉬한 문자열을 16진수(hex)로 바꿔주는 로직.
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
// 이 위에는 password 변수가 담은 값을 SHA-256을 하는 과정이고, 실제 DB에 Insert 쿼리를 보내는건 아래 한 줄이다.
dataReader.insertData(name, id, hexString.toString()); // password 변수 대신 hexString.toString()을 넣어야 SHA-256 암호화 한 데이터를 보낸다.
} catch (Exception ex) {
throw new RuntimeException(ex); // RuntimeException을 추가한다.
}
dataReader.close(); // DataReader를 닫는다.
CSS (.jsp 파일 head에 추가) (CSS 파일 위치 : 프로젝트 > src > main > sebapp > resources)
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/파일이름.css">
쿼리 보내기
String query =
PreparedStatement preparedStatement = this.connection.prepareStatement(query);
int result = preparedStatement.executeUpdate(); 또는 ResultSet resultSet = preparedStatement.executeQuery();
String query =
Statement statement = this.connection.createStatement();
int result = statement.executeUpdate(query); 또는 ResultSet resultSet = statement.executeQuery(query);
1) PreparedStatement와 Statement는 query를 쓰는 위치가 다르다.
2) int result 는 쿼리의 실행 결과 return값이 없어도 되지만, ResultSet resultSet 는 쿼리의 실행 결과 return값이 반드시 필요하다. ResultSet은 쿼리의 실행 결과를 ResultSet이라는 객체로 받는다. 따라서, INSERT, UPDATE와 같은 return값이 없는 쿼리의 경우는 int result 를 써야하고, SELECT와 같이 return값이 있는 쿼리의 경우는 ResultSet resultSet 를 써서 return값을 객체로 받아야 다시 HomeController에 return을 할 수 있다.
DataReader 메소드의 return 형태에 따른 차이
public int 메소드(인풋 파라미터) throws SQLException {
String query =
PreparedStatement preparedStatement = this.connection.prepareStatement(query); // PreparedStatement를 이용해 접속 엔진을 연다.
preparedStatement.setString(1, 값);
preparedStatement.setString(2, 값);
int result = preparedStatement.executeUpdate(); // .executeQuery()의 return값은 boolean이라 int result에 담을 수 없다. 최종 return값인 result가 int형태기 때문에 .executeUpdate()로 쿼리를 보내야한다.
preparedStatement.close();
return result; // return값은 int 형태여야한다. (하지만 위 HomeController는 이 메소드를 호출한 다음 return값은 받지 않는다. 메소드는 return을 보내지만 HomeController에서 return값을 받지 않음.)
}
public boolean 메소드(인풋 파라미터) throws SQLException {
boolean result = false;
String query =
PreparedStatement preparedStatement = this.connection.prepareStatement(query);
preparedStatement.setString(1, 값); // 1번째 물음표
preparedStatement.setString(2, 값); // 2번째 물음표
ResultSet resultSet = preparedStatement.executeQuery(); // ResultSet은 쿼리 결과를 그대로 받아온다.
if (resultSet.next()) {
result = true; // ResultSet을 이용해 일치하면 return값인 result에 boolean 형태의 값을 넣너준다.
}
resultSet.close();
preparedStatement.close();
return result; // return값은 boolean 형태여야한다. (위 HomeController에서 return값을 받아 사용한다.)
}
파라미터에 String이 아닌 Int값을 넣고 싶다면 preparedStatement.setInt(1, 값);을 사용한다.
여러개를 조회할 때는 while로 조회하고, 하나만 선택할 때는 if로 조회한다.
setString 일 때는 if (resultSet.next())로 조회했지만, setInt 일 때는 while(resultSet.next())로 조회한다.(?? 확인 필요)
세션 처리
@RequestMapping의 메소드가 인풋 파라미터로 HttpServletRequest request를 미리 인스턴스화 해놔야한다.
// 세션에 저장하기
HttpSession session = request.getSession();
session.setAttribute(String "변수명", Object 값);
// 세션 불러오기
HttpSession session = request.getSession();
String 변수명 = (String)session.getAttribute("변수명");
// 세션 종료
HttpSession session = request.getSession();
session.invalidate();
HTML 테이블 형태로 데이터를 내보내기 (DataReader -> HomeController -> VIew)
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
DataReader dataReader = new DataReader(dbUrl, "tableName");
dataReader.open();
try {
String result = dataReader.selectData();
model.addAttribute("userInfo", result);
} catch (Exception e) {
e.printStackTrace();
}
dataReader.close();
return "home";
$(".class태그")
$("#id 태그")
$("[name=name태그]")
String query = "INSERT INTO " + this.dbTableName + " (name, id, pw, nclass, address, phone, created) values(?,?,?,?,?,?,?);";
String query = "SELECT * FROM " + this.dbTableName + " WHERE id=? AND pw=?;" ;
String query = "UPDATE " + this.dbTableName + " SET name=?, nclass=?, address=?, phone=?, modified=? WHERE id=?;";
String query = "DELETE FROM " + this.dbTableName + " WHERE " + " id=?; " ;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = dateFormat.format(System.currentTimeMillis());
<!-- form 태그는 type="submit" 버튼을 누르면 action을 실행한다. name은 각각 파라미터 이름이 되고, 입력된 값은 각 파라미터의 값이 된다. HomeController에서 HttpServletRequest가 .getParameter를 통해 파라미터와 값에 접근한다. -->
<form action="/Users/signup_action" method = "post">
이름 <input type="text" name="name" placeholder="이름을 입력해주세요" />
<br />
ID <input type="text" name="id" placeholder="아이디를 입력해주세요" />
<br />
PW <input type="password" name="password" placeholder="패스워드를 입력해주세요" />
<br /><br />
<input type="submit" name="" value="회원가입" />
</form>
jsp 파일과 html 파일 사용의 차이
jsp 파일을 만들 경우, 컨트롤러(서버)에 각 페이지의 jsp파일을 html 파일로 컴파일해서 보내주는 라우터를 만들어야한다.
따라서, home.jsp가 있다면 home.jsp를 html로 컴파일해서 보내주는 라우터가 하나 필요하다.
하지만 처음부터 html파일로 만들 경우 서버는 요청이 들어오면 자동으로 html파일을 보내주기 때문에 라우터가 필요 없다.
이후는 jsp, html 모두 동일하게 해당 페이지에서 요청하는 CRUD 기능 개수만큼 라우터를 만들어주면 된다.
예를 들어 home이라는 페이지가 있고, 그 페이지에서 CRUD 액션이 하나씩 있다면 필요한 라우터는 아래 표와 같다.
jsp | html | |
home.html 페이지 요청에 응답하는 라우터 |
@GetMapping("/home") public String home(Model model) { return "home"; } |
라우터 필요 없음 |
C | @PostMapping("/home_action") public String homeInsert(Model model) { return response; } |
@PostMapping("/home_action") public String homeInsert(Model model) { return response; } |
R | @GetMapping("/home_action") public String homeSelect(Model model) { return response; } |
@GetMapping("/home_action") public String homeSelect(Model model) { return response; } |
U | @PutMapping("/home_action") public String homeUpdate(Model model) { return response; } |
@PutMapping("/home_action") public String homeUpdate(Model model) { return response; } |
D | @DeleteMapping("/home_action") public String homeDelete(Model model) { return response; } |
@DeleteMapping("/home_action") public String homeDelete(Model model) { return response; } |
CRUD의 return type은 response로 보낼 데이터에 따라 String, int, MashMap, ArrayList 등으로 적당히 바꿔 사용하면 된다.
i.e. public HashMap<String, Object> homeSelect(Model model)
문자열이 정수(숫자)로 형변환 가능한지 확인하는 메소드
// String이 숫자로 형변환이 가능한지 아닌지를 검사하는 메소드
private boolean isIntegerString(String numericString) {
try {
int result = Integer.parseInt(numericString);
return true;
} catch (Exception e) {
}
return false;
}
문자열이 실수(숫자)로 형변환 가능한지 확인하는 메소드
// String이 실수로 형변환이 가능한지 아닌지를 검사하는 메소드
public static boolean isFloatString(String numericString) {
try {
double result = Double.parseDouble(numericString);
return true;
} catch (Exception e) {
}
return false;
}
for each
자바
for (type var: iterate) {
}
for(String number: numbers) {
}
for (People each : objects) {
}
iterate는 반복될 데이터, type에는 var의 자료형, var에는 for each 내부에서 사용할 변수명이다. iterate에는 ArrayList 등이 들어간다.
즉, 타입의 numbers라는 그룹에서 String 타입의 데이터를 number라는 변수로 for each를 돌린다.
objects 라는 그룹에서 People 타입의 데이터를 each라는 변수로 for each를 돌린다.
이 때 넘겨받은 objects는 ArrayList<People> objects 다.
jsp(c 태그 이용)
<c:forEach var="each" items="${list }">
</c:forEach>
${list } 이 부분에서 ${ } 이거는 스프링에서 홈컨트롤러로부터 addAttribute로 넘겨 받은 변수라 이렇게 적었다.
'개발자 > Java' 카테고리의 다른 글
Java (자바) 형변환 그리고 나눗셈 (0) | 2020.03.28 |
---|---|
Java (자바)의 자료형 및 범위 (0) | 2020.03.27 |
Java (자바) 숫자 입력 받기 (0) | 2020.03.26 |
Java (자바) 이클립스(Eclipse) 설치하고 Hello, world! 띄우기 (0) | 2020.03.25 |
Java (자바) 설치하기 (0) | 2020.03.25 |