ユーザー登録、ログイン、ログアウトについて


学習の黒馬のプログラマーの小さいプロジェクト:Userプロジェクトのソースコードはダウンロードします:http://download.csdn.net/detail/itjavawfc/8110221
小プロジェクトを通じて:主にユーザー登録登録登録登録抹消の論理処理を理解する
プロジェクト分析図
关于用户注册、登陆、注销小项目_第1张图片
プロジェクト構造図:
                            关于用户注册、登陆、注销小项目_第2张图片
关于用户注册、登陆、注销小项目_第3张图片
indexでjspホームページ:
jstlラベルを使用するには、次の手順に従います.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<body>
	<h1>    </h1><hr>
	<c:if test="${sessionScope.user==null}">
		    !  !
		<a href="${pageContext.request.contextPath }/regist.jsp">  </a>
		<a href="${pageContext.request.contextPath }/login.jsp">  </a>
	</c:if>
	<c:if test="${sessionScope.user!=null}">
		    !${sessionScope.user.username }!
		<a href="${pageContext.request.contextPath }/servlet/LogoutServlet">  </a>
	</c:if>
  </body>

「ログイン」ページで、次の操作を行います.
 <body>
  	<div align="center">
 	<h1>    _  </h1><hr>
 	<font color="red"><strong>${msg }</strong></font>
 	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="POST">
		<table border="1">
			<tr>
				<td>   :</td>
				<td><input type="text" name="username" <strong>value="<UserTag:URLDecoder content="${cookie.remname.value }" encode="utf-8"/>"</strong>/></td>
			</tr>
			<tr>
				<td>  :</td>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td><input type="submit" value="  "/></td>
				<td><input type="checkbox" value="ok" name="remname" 
					<strong><c:if test="${cookie.remname!=null }">
						checked="checked" 
					</c:if></strong>
				/>     </td>
			</tr>
		</table>
 	</form>
 	</div>
  </body>

ここで、${msg}はエラーメッセージであり、バックグラウンドから例外処理が投げ出されてフロントに表示されます.
     :<strong>value="<UserTag:URLDecoder content="${cookie.remname.value }" encode="utf-8"/>"</strong>/></td>           cookie    
${cookie.remname:         ,  cookie   。

LoginServiceで
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		UserService service = new UserService();
		<strong>//1.             </strong>
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		<strong>//2.  Service           </strong>
		User user = service.isUser(username, password);
		if(user == null){
			<strong>//3.        </strong>
			request.setAttribute(<strong>"msg"</strong>, "        !");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			return;
		}else{
			<strong>//4.               </strong>
			request.getSession().setAttribute("user", user);
			
			if("ok".equals(request.getParameter("remname"))){
				//              cookie         
				Cookie remNameC = new Cookie("remname",URLEncoder.encode(user.getUsername(), "utf-8"));
				remNameC.setPath(request.getContextPath());
				remNameC.setMaxAge(3600*24*30);
				response.addCookie(remNameC);
			}else{
				//                      cookie
				Cookie remNameC = new Cookie("remname","");
				remNameC.setPath(request.getContextPath());
				remNameC.setMaxAge(0);
				response.addCookie(remNameC);
			}
			
			response.sendRedirect(request.getContextPath()+"/index.jsp");
		}
	}

レジスでjsp中
<head>
  	<script type="text/javascript">
  		function <strong>changeImg</strong>(img){
  			img.src = img.src+"?time="+new Date().getTime();
  		}
  	</script>
  </head>
  <body style="text-align: center;">
  	<h1>    _  </h1><hr>
  	<font color="red">${msg }</font>
  	<form action="${pageContext.request.contextPath}/servlet/RegistServlet" method="POST" >
  		<table border="1">
  			<tr>
  				<td>   </td>
  				<td><input type="text" name="username" value="<strong>${param.username </strong>}" /></td>
  			</tr>
  			<tr>
  				<td>  </td>
  				<td><input type="password" name="password" /></td>
  			</tr>
  			<tr>
  				<td>    </td>
  				<td><input type="password" name="password2" /></td>
  			</tr>
  			<tr>
  				<td>  </td>
  				<td><input type="text" name="nickname" v<strong>alue="${param.nickname }</strong>"/></td>
  			</tr>
  			<tr>
  				<td>  </td>
  				<td><input type="text" name="email" <strong>value="${param.email }</strong>" /></td>
  			</tr>
  			<tr>
  				<td>   </td>
  				<td><input type="text" <strong>name="valistr"</strong> /></td>
  			</tr>
  			<tr>
  				<td><input type="submit" value="  " /></td>
  				<strong><td><img src="${pageContext.request.contextPath }/servlet/ValiImg" style="cursor: pointer" onclick="changeImg(this)"/></td</strong>>
  			</tr>
  		</table>
  	</form>
  </body>

この中の検証コードは非常に重要で、検証コードはクリックするたびに自動的にリフレッシュされます
ユーザー名、ニックネーム、メールボックスは入力エラー時にページテーブルに表示され、入力エラー中に重複した書き込みを避けることができます.
レジスターでJAvaで
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			request.setCharacterEncoding("utf-8");
			response.setContentType("text/html;charset=utf-8");
			UserService service = new UserService();
			<strong>//1.     </strong>
			String valistr = request.getParameter("valistr");
			String valistr2 = (String) request.getSession().getAttribute("valistr");
			if(valistr == null || valistr2==null || !valistr.equals(valistr2)){
				request.setAttribute("msg", "      !");
				request.getRequestDispatcher("/regist.jsp").forward(request, response);
				return;
			}
			<strong>//2.        </strong>
			User user = new User();
			<strong>BeanUtils.populate(user, request.getParameterMap());             map,       user.set()  </strong>
			user.checkValue();
			<strong>//3.  Service        </strong>
			service.registUser(user);
			<strong>//4.    </strong>
			request.getSession().setAttribute("user", user);   //     session  
			<strong>//5.      3     </strong>
			response.getWriter().write("       !3     ....");
			response.setHeader("refresh", "3;url="+request.getContextPath()+"/index.jsp");
		}catch (MsgException e) {
			request.setAttribute("msg", e.getMessage());
			request.getRequestDispatcher("/regist.jsp").forward(request, response);
			return;
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		
	}

LogoutServiceletはとても簡単です
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		<strong>if(request.getSession(false)!=null && request.getSession().getAttribute("user")!=null){
			request.getSession().invalidate();
		}</strong>
		response.sendRedirect(request.getContextPath()+"/index.jsp");
	}

図面のサーブレット
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setDateHeader("Expires", -1);
		response.setHeader("Cache-Control", "no-cache");
		response.setHeader("Pragma", "no-cache");
		//1.           
		int height = 30; 
		int width = 120;
		int xpyl = 5;
		int ypyl = 22;
		int bang = 20;
		BufferedImage img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		//2.        
		Graphics2D g = (Graphics2D) img.getGraphics();
		//3.     
		g.setColor(Color.LIGHT_GRAY);
		g.fillRect(0, 0, width, height);
		//4.    
		g.setColor(Color.BLUE);
		g.drawRect(0, 0, width-1, height-1);
		//5.    
		for(int i = 0;i<5;i++){
			g.setColor(Color.RED);
			g.drawLine(randNum(0, width), randNum(0, height), randNum(0, width), randNum(0, height));
		}
		//6.  
<span style="white-space:pre">	</span><span style="white-space:pre">	</span> String base =//        ,     。
<span style="white-space:pre">		</span> StringBuffer buffer = new StringBuffer();
<span style="white-space:pre">		</span> for(int i = 0; i<4;i++){
<span style="white-space:pre">			</span>g.setColor(new Color(randNum(0,255),randNum(0,255),randNum(0,255)));
<span style="white-space:pre">			</span>g.setFont(new Font("  ",Font.BOLD,bang));
<span style="white-space:pre">			</span>int r = randNum(-45,45);
<span style="white-space:pre">			</span>g.rotate(1.0*r/180*Math.PI, xpyl+(i*30), ypyl);
<span style="white-space:pre">			</span>String s = base.charAt(randNum(0, base.length()-1))+"";
<span style="white-space:pre">			</span>buffer.append(s);
<span style="white-space:pre">			</span>g.drawString(s, xpyl+(i*30), ypyl);
<span style="white-space:pre">			</span>g.rotate(1.0*-r/180*Math.PI, xpyl+(i*30), ypyl);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span> <strong>request.getSession().setAttribute("valistr", buffer.toString());   //         Session  </strong>
<strong>
</strong><span style="white-space:pre">		</span> System.out.println(buffer.toString());
<span style="white-space:pre">		</span>//         
<span style="white-space:pre">		</span>ImageIO.write(img, "jpg", response.getOutputStream());
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>private Random rand = new Random();
<span style="white-space:pre">	</span>private int randNum(int begin,int end){
<span style="white-space:pre">		</span>return rand.nextInt(end-begin)+begin;
<span style="white-space:pre">	</span>}

上記のビジネスロジックは、登録抹消のプロセスを明確に示しています.
次はDAOサービス・モデル層を見て、単独で学習を出すことができます:xml解析【XPath】を学ぶ
User.java
package com.itheima.domain;

import java.io.Serializable;

import com.itheima.exception.MsgException;

public class User implements Serializable {
	private String username;
	private String password;
	private String password2;
	private String nickname;
	private String email;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getPassword2() {
		return password2;
	}
	public void setPassword2(String password2) {
		this.password2 = password2;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return username+":"+password;
	}
	
	public void checkValue() throws MsgException{
		if(username==null || "".equals(username)){
			throw new MsgException("       !");
		}
		if(password==null || "".equals(password)){
			throw new MsgException("      !");
		}
		if(password2==null || "".equals(password2)){
			throw new MsgException("        !");
		}
		if(!password.equals(password2)){
			throw new MsgException("       !");
		}
		if(nickname==null || "".equals(nickname)){
			throw new MsgException("      !");
		}
		if(email==null || "".equals(email)){
			throw new MsgException("      !");
		}
		if(!email.matches("^\\w+@\\w+(\\.\\w+)+$")){
			throw new MsgException("       !");
		}
	}
	
}

user.xml
<?xml version="1.0" encoding="utf-8"?>
<users>
	<user username="admin" password="admin" nickname="admin" email="[email protected]" />
</users>

XmlUserDao.java
package com.itheima.dao;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.itheima.domain.User;
import com.itheima.util.XmlDaoUtils;

public class XmlUserDao {
	/**
	 *          
	 * @param username    
	 * @return             bean,       null
	 */
	public User findUserByUserName(String username){
		Document dom = XmlDaoUtils.getDom();
		Element root = dom.getRootElement();
		// xml     username              
		List<Element> list = root.selectNodes("//user[@username='"+username+"']");
		if(list.size()>0){//  0         
			Element userEle = list.get(0);
			//           bean   
			User user = new User();
			user.setUsername(userEle.attributeValue("username"));
			user.setPassword(userEle.attributeValue("password"));
			user.setNickname(userEle.attributeValue("nickname"));
			user.setEmail(userEle.attributeValue("email"));
			return user;
		}else{//          
			return null;
		}
	}
	
	
	/**
	 *     
	 * @param user         bean
	 */
	public void addUser(User user){
		Document dom = XmlDaoUtils.getDom();
		Element root = dom.getRootElement();
		//       <user>  ,     user  ,        
		Element userEle = DocumentHelper.createElement("user");
		userEle.setAttributeValue("username", user.getUsername());
		userEle.setAttributeValue("password", user.getPassword());
		userEle.setAttributeValue("nickname", user.getNickname());
		userEle.setAttributeValue("email", user.getEmail());
		//   <users>   
		root.add(userEle);
		//   xml   
		XmlDaoUtils.refXml();
	}
	
	/**
	 *               
	 * @param username    
	 * @param password   
	 * @return      ,        null
	 */
	public User findUserByUNandPSW(String username,String password){
		Document dom = XmlDaoUtils.getDom();
		Element root = dom.getRootElement();
		// xml     username               password          
		List<Element> list = root.selectNodes("//user[@username='"+username+"' and @password='"+password+"']");
		if(list.size()>0){//  0         
			Element userEle = list.get(0);
			//           bean   
			User user = new User();
			user.setUsername(userEle.attributeValue("username"));
			user.setPassword(userEle.attributeValue("password"));
			user.setNickname(userEle.attributeValue("nickname"));
			user.setEmail(userEle.attributeValue("email"));
			return user;
		}else{//          
			return null;
		}
	}
}

XmlDaoUtils
public class XmlDaoUtils {
	private static Document dom = null;
	private static String path = XmlDaoUtils.class.getClassLoader().getResource("users.xml").getPath();
	private XmlDaoUtils() {
	}
	static{
		try{
			SAXReader reader = new SAXReader();
			dom = reader.read(path);
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	public static Document getDom(){
		return dom;
	}
	
	public static void refXml(){
		try {
			XMLWriter writer = new XMLWriter(new FileOutputStream(path),OutputFormat.createPrettyPrint());
			writer.write(dom);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
}

UserService
package com.itheima.service;

import com.itheima.dao.XmlUserDao;
import com.itheima.domain.User;
import com.itheima.exception.MsgException;

public class UserService {
	private XmlUserDao dao = new XmlUserDao();
	/**
	 *     
	 * @param user
	 * @throws MsgException 
	 */
	public void registUser(User user) throws MsgException{
		//1.           ,         
		if(dao.findUserByUserName(user.getUsername())!=null){
			throw new MsgException("       !");
		}
		//2.        dao        
		dao.addUser(user);
	}
	
	/**
	 *            
	 * @param username
	 * @param password
	 */
	public User isUser(String username,String password){
		return dao.findUserByUNandPSW(username, password);
	}
	
}

test
package com.itheima.test;

import org.junit.Test;

import com.itheima.dao.XmlUserDao;
import com.itheima.domain.User;

public class XmlUserDaoTest {
	@Test
	public void testFindUserByUserName(){
		XmlUserDao dao = new XmlUserDao();
		User user = dao.findUserByUserName("adminxxx");
		System.out.println(user);
	}
	
	@Test
	public void testFindUserByNMandPSW(){
		XmlUserDao dao = new XmlUserDao();
		User user = dao.findUserByUNandPSW("admin", "adminxx");
		System.out.println(user);
	}
	
	@Test
	public void testAddUser(){
		XmlUserDao dao = new XmlUserDao();
		User user = new User();
		user.setUsername("  ");
		user.setPassword("123");
		user.setNickname("   ");
		user.setEmail("[email protected]");
		dao.addUser(user);
	}
}