// 이전페이지에서 정보를 받아오기 System.out.println("입력숫자 : " + request.getParameter("num")); //콘솔에서 출력 out.println("입력하신 숫자는 " + request.getParameter("num")); //html화면에서출력
//form태그에서 get방식으로 정보를 전달할시 모든 데이터는 string타입으로 변경되어 전달되기때문에 //숫자데이터 출력을 원하면 형변환Integer.parseInt()해줘야한다 int num = Integer.parseInt(request.getParameter("num")); 정수형값 : <%=num %> <br>
3. 파라미터값 한글처리
form get방식과 달리 post방식을 사용하면 한글이 깨지는 문제가 발생한다. 따라서 body태그 바로 밑에 파라미터 한글처리 코드가 필요하다.
1 2 3 4
<!-- form post방식을 사용하면 한글이 깨지는 문제가 발생하기때문에 파라미터 한글처리 코드가 필요하다 --> <% request.setCharacterEncoding("UTF-8"); %>
4. 동일한 파라미터의 값을 변수로 가져오기
사용자가 radio박스를 클릭하면 해당 데이터를 변수로 가져올수있다.
request.getParameter("") : 큰따옴표안에 name속성을 넣으면된다.
정보를 입력하는 페이지는 아래와 같이 radio버튼을 만들어놓았다.
1 2 3 4 5 6 7
<formaction="정보출력페이지.jsp"method="post"name="fr"> <label>성별 : </label> <inputtype="radio"name="gender"value="womyn"> 여성 <inputtype="radio"name="gender"value="men"> 남성
<formaction="정보출력페이지.jsp"method="post"name="fr"> <label>취미 : </label> <inputtype="checkbox"name="hobby"value="game"> 게임 <inputtype="checkbox"name="hobby"value="movie"> 영화감상 <inputtype="checkbox"name="hobby"value="workout"> 운동
//배열출력1 : for each이용 for(String s :arr1){ System.out.print(s + "\t"); } //배열출력2 : Arrays클래스 API이용 System.out.println(Arrays.toString(arr1));
// 출력값 JAVA Not bad is [JAVA, Not, bad, is]
4. Arrays 로또 만들기
배열에 무작위 숫자로 구성된 로또를 만들고 정렬 후 출력하는 게임을 만들어보자. 로또는 1~45사이의 숫자로 구성되며 6개의 숫자를 랜덤으로 뽑느다. 그리고 모든 숫자의 중복 x.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
int[] selected = newint[6]; //로또를 저장할 배열 int[] fullBall = newint[45]; //모든 공의 정보를 가지고 있는 배열
int cnt= 0; Random rd = new Random(); while(cnt < 6){ //총 6개의 공을 선택할 조건 int index = rd.nextInt(45); //0~44사이의 정수 int ball = fullBall[index]; if(ball ==0){ //중복체크 selected[cnt] = index +1; fullBall[index] = -1; cnt ++; } } Arrays.sort(selected); System.out.println(Arrays.toString(selected)); }
random.nextInt(n) 이는 0~(n-1)개의 정수를 랜덤하게 생성한다. 그렇다면 여기선 random.nextInt(45)이므로 0~44사이의 랜덤한 정수를 생성하게된다. 왜그럴까? selected된 공은 index에서 +1해주기때문이다 if문을 보자. 랜덤으로 index가 0이 걸리면 선택된 공은 1이되고 랜덤으로 index가 44가 걸리면 선택된공은 45가된다.
ball if문으로 중복체크 ball = 0이 참이면 이 fullBall[index]가 한번도 뽑힌적이 없는 숫자라는 의미이다. 그리고 선택되어지고 selected[cnt] = index +1을 준다. 그리고 이미 뽑힌 수는 -1로 값을 준다. 그렇게되면 다음번에 또 뽑혔을때 -1이기때문에 거짓이 되어 selected가 되지않는다.
1 2 3
예를 들어 fullBall[2]가 처음뽑혔으면 if문이 참이므로 selected[1]가 되고 로또숫자는 3이다. 그리고 난 뒤 fullBall[2] = -1로 바뀌어서 다음번에 뽑혀도 if문에서 거짓으로 팅겨나간다
5. System.arraycopy()
배열은 한 번 생성되면 메모리의 연속성때문에 그 크기를 변경할 수 없다. 하지먼 프로그래밍을 하다 보면 처음 예상했던 데이터의 개수보다 더 많은 데이터를 관리해야할 경우가 있다. 이를 예방하기위해 처음부터 배열의 크기를 크게 지정해버린다면 불필요한 메모리를 낭비하는 꼴이다.
필요에 따라 배열의 길이를 늘이기 위해서는 기존배열의 길이를 늘일수는 없고 배열의 길이 큰 새로운 배열은 만들고 기존 데이터를 복사해 넣은 다음 새로운 데이터를 추가해야한다.
만들어놓은 DB에 내가 만든 앱 연결해보자. 이는 admin.py를 이용해서 진행해야한다.
1. admin.py 작성
데이터를 추가,수정한 뒤 migrate를 한 상태에서 상위 앱폴더에서 admin.py폴더를 찾는다. 그리고 migrate한 models안에 있는 내용을 import해온다. pass는 아무것도 안하겠다는 의미이다. 그 뒤 아래와 같이 빈 클래스를 만들어 admin에 두가지(Fcuser, FcuserAdmin) 다 등록(register)한다.
1 2 3 4 5 6 7
from django.contrib import admin from .models import Fcuser
classFcuserAdmin(admin.ModelAdmin): pass
admin.site.register(Fcuser, FcuserAdmin)
2. python3 manage.py runserver
명령어입력 잘 반영되었는지 runserver명령어롤 틍해 실행해보자. 터미널에 아래 코드들이 출력되고 그 중 http://127.0.0.1:8000/를 ctrl를 누른상태에서 click하면 바로 인터넷창이 오픈된다.
1 2 3 4 5 6 7 8 9
(fcdjango_venv) C:\경로\fc_community>python manage.py runserver Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced). June 21, 2020 - 14:47:46 Django version 3.0.7, using settings 'fc_community.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
주소창에 admin/ 추가입력 후 enter. 인터넷창이 오픈되면 주소뒤에 admin/을 붙여준다. 그러면 장고에서 기본적으로 제공하는 site가 출력되면서 로그인페이지가 나타난다. 아직 첫 아이디를 만들지 않았으므로 인터넷창을 닫아주고 터미널창에 ctrl+c 명령어를 입력하여 돌아가던 server를 멈춰준다.
3. python3 manage.py createsuperuser
manage.py명령어를 통해 첫 user를 생성한다. 자동적으로 아이디와 이메일주소, 비번과 비번확인 총 4단계의 입력과정을 거치면 드디어 생성!!
다시python3 manage.py runserver를 통해 http://127.0.0.1:8000/admin/으로 들어가서 방금 생성한 아이디와 비번으로 로그인을 한다. 그러면 아래와 같이 사이트가 뾰로롱 생성된다.
파란색띠가 app을 나타내며
Authentication and Authorization 은 장고에서 제공하는 기본 앱이고
내가 만들었던 fcuser앱이 정상적을 출력되고 그 아래에 만들었던 Fcusers모델이 잘 등록되어있는 것을 확인할 수 있다.
add를 누른뒤 사용자명과 비밀번호를 입력하면 아래 이미지처럼 Fcuser object(1)가 생성되고 그 안에 추가로 만든 사용자명과 비밀번호를 확인할 수 있다.
이렇듯 장고는 데이터베이스를 건들이지않아도 웹페이지에서 데이터베이스를 쉽게 다룰 수 있어 정말 편리하다. 조금 아쉬운 점이 있다면 유저명이 Fcuser object(1) 이렇게 생성되어서 어떤 유저인지 한눈에 확인하기 어렵다. 이를 바꿔주는 설정을 해보자.
4. DB웹상 유저명 보기 쉽게 변경
파이썬에는 기본 문자열을 반환해주는 언더바 두개로 감싼 내장함수( str )를 가지고 있다. 이를 이용하여 문자열을 원하는대로 바꿀수있다. fcuser앱 아래의 models.py에서 class 안에 아래 코드를 추가해주면된다.
1 2
def__str__(self): return self().username
5. DB웹상 다양한 유저정보 출력
원하는대로 Fcuser object(1)에서 유저명으로 변경되었다. 하지만 뭔가 좀 아쉽다. 더 많은 정보들이 한눈에 보였으면 좋겠다. 이럴때 해줄 수 있는 방법이 있다. fcuser앱 아래의 admin.py에서 class 안에 아래 코드를 추가해주면된다. password말고도 다양한 내용을 추가입력하면 아래 이미지처럼 한눈에 보기좋게 출력된다.
회원가입페이지에서 구현해볼 기능. 1. 모든정보입력시 회원가입가능 2. 각항목의 입력값이 없을 경우 해당 요소의 알림과 함께 포커싱 3. id는 최소 4자리에서 최대10자리만 허용 4. 비밀번호확인시 두개의 값이 같은 경우 회원가입가능, 다른경우 비밀번호 확인창에 포커싱 후 경고창띄우기 5. 주민번호를 입력받으면 성별자동체크 6. 취미 선택안된경우 1번 옵션 선택 7. 과목 선택안된경우 경고창
functioncheckall(){ //데이터유효성체크 let id = document.fr.id.value let pw = document.fr.pw.value let repw = document.fr.repw.value let name = document.fr.name.value let idnum1 = document.fr.idnum1.value let idnum2 = document.fr.idnum2.value let womyn = document.fr.gender[0] let men = document.fr.gender[1]
아래는 강사님이 python3 manage.py makemigrations명령어를 입력하고 난 뒤의 터미널 출력모습이다.
그리고 아래 이미지는 내 터미널에서 출력한 모습이다.
내가 뭐 터미널에 치는 코드들이 툭하면 자꾸 은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.라는 출력이 떴다.
너무나 빡쳐!!!!
빡치고있는 와중에 구글링해보니 위의 에러는 환경변수에 의해 발생하는 에러라고 한다. 내가 컴퓨터가 두대가 있는데 하나는 윈도우 10을 쓰지만 다른 하나는 윈도우 7를 쓴다. 그래서 두 OS에 python과 vscode 그리고 가상환경을 사용할 수 있는 환경변수 설정방법을 기록하려고 한다
1. python과 vscode 그리고 가상환경을 사용할 수 있는 환경변수 설정방법
1. 윈도우10 환경변수
window키를 누르고 검색창에 고급 시스템 설정 보기를 검색한다. 띄어쓰기에 유의하자.
윈도우 10의 경우 환경변수를 추가할 수 있게끔 예쁜 GUI가 나온다. 새로만들기를 클릭하고 아래를 추가해준다
변수 값 : C:\Users\파이썬저장한경로\Python\Python38\Scripts;
위의 값은 파이썬에서 가상환경을 사용하기 위한 내용이다. 이 밖에도 python과 vscode를 추가해주면 되는데 사실 프로그램을 다운로드할때 자동적으로 추가가되어있을 것이다. 깔끔하게 해결!!
2. 윈도우7 환경변수 설정
하지만 윈도우7의 경우는 거지같이 나온다. 일단 환경변수 설정에 들어가보자. window키를 누르고 검색창에 고급 시스템 설정 보기를 똑같이 검색한다. 띄어쓰기에 유의하자.
새로만들기를 클릭하고 아래 값을 그대로 입력했다
변수이름 : path
변수 값 : C:\Users\파이썬저장한경로\Python\Python38\Scripts;
왜지? 윈도우10은 리스트에 추가된 행이 바로 나오는데 윈도우7은 전혀 그런게 보이지않았다. 내가 잘못했나? 다시 path의 값 전체를 삭제하고 파이썬의 가상환경을 사용하기위해서 아래를 입력했다. 꼭 자신이 파이썬과 vs code, 가상환경을 다운로드한 경로를 지정해야한다. C:\Users\파이썬저장한경로\Python\Python38\Scripts\;를 붙여넣었다.
3. 설치위치 찾기
만약 python과 vs code, 가상환경을 어디 설치했는지 경로를 모르겠다면? 걱정 할 필요없다! window에서 모든 프로그램을 클릭한 후 python을 찾은 뒤 우클릭한다. 그리고 속성을 클릭하면 대상에 경로가 설정되어있다. 그 경로 그대로 복붙하면 된다!
그리고 새로만들기를 눌렀는데 아무런 변화가 없다?!?! 그래서 변경을 누르고 기존 path를 아예 삭제하고 다시 등록해보았다. 그.런.데. 알고보니 path의 기존경로는 절대 지우면 안되고 그 뒤에 세미콜론(;)으로 붙여서 입력해야한다는 것이다. window의 기본 path는 건들면 절대 안된다고 한다! 나는 그것도 모르고… 이미 지워버렸다… 멘붕왔다가 잠시 진정하고 다시 환경변수 기본값을 찾는 여정부터 이어나갔다.
4. 환경변수 기본값 찾기
환경변수의 기본값은 찾는 방법은 아래와 같다. cmd를 열고 regedit명령어를 입력한다. 레지스트리편집기가 자동으로 open될텐데 아래 위치로 찾아간다.
그리고 path를 더블클릭하면 변경되기전이 값이 저장되어있다. 복붙해서 환경변수에 한꺼번에 등록했다. 휴- 살았다!
2. Database관리
데이터베이스를 관리해보자. 데이터를 수정,추가한 경우에 항상 1번부터 2번까지 반복을 해주면 데이터베이스버전이 새로 생성되고 관리된다.
python3 manage.py makemigrations명령어를 입력한다 내 경우에는 ‘python3’은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다.에러가 사라지지않았다… 하지만 python명령어는 위의 환경변수 세팅을 통해 잘되었으므로 3을 뺀 python manage.py makemigrations를 입력했다. 다행히 성공적으로 create model이 되었다.
python3 manage.py migrate 위와 마찬가지로 3을 뺀 뒤 실행했더니 잘 진행되었다.
1번과 2번을 통해 우리는 명령어 sqlite3 db.sqlite3등을 이용하여 직접 sqlite를 만질 필요가 없다. 왜냐면 장고가 다 알아서 데이터베이스의 테이블을 자동으로 생성해주기때문이다.