2014-11-28 2 views
0

jsp와 servlet을 모두 사용하여 로그인 양식을 설정했습니다. 서블릿을 컨트롤러로 사용하고 jsp를 모델로 사용했습니다.MVC 기반 JSP 서블릿 -JDBC 로그인

JSP :

<%@page import="com.horizon.entity.Users"%> 
<%@page import="com.horizon.da.UserDA"%> 
<%@page import="com.horizon.service.UserService"%> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Welcome to Horizon Airways</title> 

</head> 
<body> 
<h2 align="center">Welcome to</h2><br> 
<h1 align="center">Horizon Airways</h1><br><hr> 
<form action="./login.do" method="post"> 
<table align="center"> 
<tr> 
<th>User name: </th> 
<td><input type="text" name="username"></td> 
</tr> 
<tr> 
<th>Pass word: </th> 
<td><input type="password" name="password"></td> 
</tr> 
<tr> 
<td align="center"> 
<input type="submit" value="Login"> 

</td> 
<td align="center"><input type="reset" value="Clear"></td> 
</tr> 
</table> 
</form> 
</body> 
</html> 

서블릿 : 여기 코드는

package com.horizon.servlet; 

import java.io.IOException; 

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

import com.horizon.da.UserDA; 
import com.horizon.entity.Users; 
import com.horizon.service.UserService; 



public class ControllerServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 


    public ControllerServlet() { 
     super(); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String path = request.getServletPath(); 
     HttpSession session = request.getSession(); 
      if(path.equals("/login.do")) { 
       String username = request.getParameter("username"); 
       String password = request.getParameter("password"); 
       UserService service = new UserService(); 
       UserDA da = new UserDA(); 
       service.setDA(da); 
       Users user = da.verifyUser(username, password); 
       session.setAttribute("user", user); 
       String address = null; 
       if(user.getRole() == "Business Manager") 
        address = "./view.jsp"; 
       else if(user.getRole() == "Counter Assistant") 
        address = "./manage.jsp"; 
       RequestDispatcher dispatcher = request.getRequestDispatcher(address); 
       dispatcher.forward(request, response); 
      } 
    } 


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doGet(request, response); 
    } 

} 

그리고 여기 오류는 다음과 같습니다

Nov 28, 2014 12:00:19 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [ControllerServlet] in context with path [/HorizonAirways] threw exception java.lang.NullPointerException at com.horizon.servlet.ControllerServlet.doGet(ControllerServlet.java:43) at com.horizon.servlet.ControllerServlet.doPost(ControllerServlet.java:49) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

내가 날 여기 데 도움이 사람을 주셔서 감사합니다.

답변

0

귀하의 문제는 여기에 있습니다 :

String address = null;//<-- is null, if below conditions didn't match 
if(user.getRole() == "Business Manager") 
    address = "./view.jsp"; 
else if(user.getRole() == "Counter Assistant") 
    address = "./manage.jsp"; 
RequestDispatcher dispatcher = request.getRequestDispatcher(address);//<-- might be null 
dispatcher.forward(request, response);//<-- raises NPE, if null 

P.S. ==을 사용하지 말고 대신 .equals()을 사용하십시오. 여기서 user role을 확인하십시오.

이 작업을 시도 할 수 있습니다 : 당신은 doGet()에 라인 (43)에 NPE을 받고

String address = "./invalid.jsp";//<-- default page, if role not match 
if(user.getRole().equals("Business Manager")) 
    address = "./view.jsp"; 
else if(user.getRole().equals("Counter Assistant")) 
    address = "./manage.jsp"; 
RequestDispatcher dispatcher = request.getRequestDispatcher(address); 
dispatcher.forward(request, response); 
+0

나는 귀하의 제안 인 Arvind를 테스트 한 결과 효과가있었습니다. 고맙습니다. 나는이 코드를 몇 시간 동안 강조했다. – randomprogrammer

+0

@randomprogrammer 내 대답을 확인하고 피드백을 줄 수있다. –

0

아마도 귀하의 주소는 비어 있습니다.

if(user.getRole() == "Business Manager") 
    address = "./view.jsp"; 
else if(user.getRole() == "Counter Assistant") 
    address = "./manage.jsp"; 
else 
    System.println.out(address); //Try to print the address here and see what's going 
0

스택 트레이스에 말했듯이. 다른 사람들이 == 대신 equals()을 사용한다고 말한대로 equalsIgnoreCase()을 사용하는 것이 좋습니다. 이는 case Of Stringuser.getRole()으로 반환 될 때 더욱 안정적입니다.

당신의 user.getRole() 반환 비즈니스 관리자 또는 사업 관리자 또는 사업 관리자 경우는별로 중요하지 않습니다.

==을 반환하지 않아야하는 실제 이유는 다음과 같습니다. - 두 개의 객체 참조 변수 [두 개의 객체가 아닌]가 동일한 객체를 참조하는지 여부를 확인하는 데 사용됩니다.

개체 참조 변수는 참조하는 개체의 주소를 포함합니다. 개체 참조 변수가 개체가 아닙니다. 실제 객체에 액세스하기위한 매핑 일뿐입니다.

그래서, 여기 user.getRole() == "Business Manager" 당신이 경우, "Business Manager"은 문자열 리터럴과 intern()은/인턴 수영장을 문자열 수영장에서 문자열의 & user.getRole() 리턴한다 가리키는 문자열 개체 참조 변수를 문자 참조 위치를 반환 implicitly를 호출한다 힙의 String 객체입니다. 따라서 ==에 따르면 주소가 같지 않습니다.

따라서 user.getRole() == "Business Manager" 확인에 실패했습니다.

당신은 equalsIgnoreCase()를 사용해야하거나 if(user.getRole().intern() == "Business Manager") 또는 if("Business Manager" == user.getRole().intern())이 같이 user.getRole()intern()를 호출 할 수 있습니다.