1、各个包在框架下的理解:
User作用:
UserDao
service
servlet
2、注册流程:
用户提交表单 jsp
如果异常,使用EL表达式输出异常信息。
传递验证码图片
servlet封装表单,传递(调用)给service#regist servlet
封装:toBean ***导包。
service.regist()
接收service结果。
service#regist。用于接收注结果。根据注册功能对应的文件操作。转发给userdao完成。自身用于接收反馈信息。
先调用userdao#findByName中查询
返回null正常:调用userdao#add添加
添加完成。跳转登陆界面。
返回异常:获取异常信息,保存到request域。转发回注册界面
userdao查询与添加。是否存在。存在则不添加。不存在则添加 完成后反馈给上层。
知识点,dom4j对xpath的操作。 ***需要导包jaxen-1.1-beta-6.jar
findByName
得到doc
使用xpath查找
没找到:返回null
找到了,返回注册异常。
add
得到doc
得到根节点
创建新元素
设值。
回写。
user数据的底层设置和获取方法。
底层文件:xml
xml格式:每个用户一个<user>属性为username和password
3、练习感想:
考虑根元素
考虑属性
考虑提交地址:项目名 + web.xml中对应的Url-pattern属性值
提交方式:EL表达式、JSTL-core库标签
EL表达式:${pageContext.request.contextPath}/RegistServlet
JSTL-core库标签:<c:url value='/RegistServlet'/>
考虑是否需要返回值,返回值类型
考虑参数
多用于servlet与jsp页面的数据请求共享
eg:1)保存错误信息到request中,(设置属性及信息)可以在jsp界面用EL表达式输出。
EL表达式的优势:有值回输出,无值不输出
2)用于用户名回显。
在jsp页面中输出域中内容,输出集合中内容。
保存一次对话的信息
可用于数据回显等操作。
用于查找xml文件节点。极其方便。
需设置src !
设置id
jsp页面需要动态效果时,需编写JavaScript代码用数据呈现动态效果。 eg:图片切换。
点击元素时启动 JavaScript。
<a href="javascript:_change()">
遗留问题:
异常处理的交互流程。
封装表单数据的过程。
代码:
package Domain
public class User {
private String username;
private String password;
private String verifyCode;
public String getVerifyCode() {
return verifyCode;
}
public void setVerifyCode(String verifyCode) {
this.verifyCode = verifyCode;
}
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 User() {
super();
}
public User(String username, String password, String verifyCode) {
super();
this.username = username;
this.password = password;
this.verifyCode = verifyCode;
}
}
package Dao
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import Domain.User;
public class UserDao {
private String path = "E:/users.xml";
/**
* 按用户名查询
*
* @param username
* @return
* @author 一万年行不行
*/
public User findByUsername(String username) {
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(path);
Element ele = (Element) doc.selectSingleNode("//user[@username='"+ username + "']");
if (ele == null)
return null;
User user = new User();
String attrUsername = ele.attributeValue("username");
String attrPassword = ele.attributeValue("password");
user.setUsername(attrUsername);
user.setPassword(attrPassword);
return user;
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
/**
* 添加用户
*
* @param user
* @author 一万年行不行
*/
public void add(User user) {
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(path);
Element root = doc.getRootElement();
Element userEle = root.addElement("user");
userEle.addAttribute("username", user.getUsername());
userEle.addAttribute("password", user.getPassword());
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer;
try {
writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"), format);
writer.write(doc);
writer.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
}
package service
/**
* @author 一万年行不行
* 自定义异常,只需要给出父类中的构造器。方便用来创建对象
*/
public class UserException extends Exception {
public UserException() {
super();
}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(String message) {
super(message);
}
public UserException(Throwable cause) {
super(cause);
}
}
public class UserService {
private UserDao userDao = new UserDao();
/**
* 注册功能
* @param user
* @throws UserException
* @author 一万年行不行
*/
public void regist(User user) throws UserException {
User _user = userDao.findByUsername(user.getUsername());
if(_user != null) throw new UserException("用户名" + user.getUsername() + ", 已被注册过了!");
userDao.add(user);
}
/**
* 登录功能
* @param form
* @return
* @throws UserException
* @author 一万年行不行
*/
public User login(User form) throws UserException {
User user = userDao.findByUsername(form.getUsername());
if(user == null) throw new UserException("用户名不存在!");
if(!form.getPassword().equals(user.getPassword())) {
throw new UserException("密码错误!");
}
return user;
}
}
package web.servlet
/**
* @author 一万年行不行
*/
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
UserService userService = new UserService();
User form = CommonUtils.toBean(request.getParameterMap(), User.class);
try {
User user = userService.login(form);
request.getSession().setAttribute("sessionUser",user);
response.sendRedirect(request.getContextPath() +"/user/welcome.jsp");
} catch(UserException e) {
request.setAttribute("msg", e.getMessage());
request.setAttribute("user", form);
request.getRequestDispatcher("/user/login.jsp").forward(request, response);
}
}
}
/**
* @author 一万年行不行
*/
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
UserService userService = new UserService();
User form = CommonUtils.toBean(request.getParameterMap(), User.class);
Map<String, String> errors = new HashMap<String, String>();
String username = form.getUsername();
if (username == null || username.trim().isEmpty()) {
errors.put("username", "用户名不能为空!");
} else if (username.length() < 3 || username.length() > 15) {
errors.put("username", "用户名长度必须在3~15之间!");
}
String password = form.getPassword();
if (password == null || password.trim().isEmpty()) {
errors.put("password", "密码不能为空!");
} else if (password.length() < 3 || password.length() > 15) {
errors.put("password", "密码长度必须在3~15之间!");
}
String sessionVerifyCode = (String) request.getSession().getAttribute(
"session_vcode");
String verifyCode = form.getVerifyCode();
if (verifyCode == null || verifyCode.trim().isEmpty()) {
errors.put("verifyCode", "验证码不能为空!");
} else if (verifyCode.length() != 4) {
errors.put("verifyCode", "验证码长度必须为4!");
} else if (!verifyCode.equalsIgnoreCase(sessionVerifyCode)) {
errors.put("verifyCode", "验证码错误!");
}
if (errors != null && errors.size() > 0) {
request.setAttribute("errors", errors);
request.setAttribute("user", form);
request.getRequestDispatcher("/user/regist.jsp").forward(request,
response);
return;
}
try {
userService.regist(form);
response.getWriter().print(
"<h1>注册成功!</h1><a href='" + request.getContextPath()
+ "/user/login.jsp" + "'>点击这里去登录</a>");
} catch (UserException e) {
request.setAttribute("msg", e.getMessage());
request.setAttribute("user", form);
request.getRequestDispatcher("/user/regist.jsp").forward(request,
response);
}
}
}
public class VerifyCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
VerifyCode vc = new VerifyCode();
BufferedImage image = vc.getImage();
request.getSession().setAttribute("session_vcode", vc.getText());
VerifyCode.output(image, response.getOutputStream());
}
}
注册界面
<head>
<script type="text/javascript">
function _change() {
var ele = document.getElementById("vCode");
ele.src = "<c:url value='/VerifyCodeServlet'/>?xxx=" + new Date().getTime();
}
</script>
</head>
<body>
<h1>注册</h1>
<p style="color: red;font-weight: 900"> ${msg} </p>
<form action="<c:url value='/RegistServlet'/>" method="post">
用户名:<input type="text" name="username" value="${user.username}"/>${errors.username}<br/>
密 码:<input type="password" name="password" value="${user.password}"/>${errors.password}<br/>
验证码:<input type="text" name="verifyCode" value="${user.verifyCode }" size="3"/>
<img id="vCode" src="<c:url value='/VerifyCodeServlet'/>" border="2"/>
<a href="javascript:_change()">换一张</a>${errors.verifyCode }<br/>
<input type="submit" value="注册"/>
</form>
</body>
登陆界面
<body>
<h1>登录</h1>
<p style="color: red; font-weight: 900">${msg }</p>
<%--${pageContext.request.contextPath }/RegistServlet --%>
<form action="<c:url value='/LoginServlet'/>" method="post">
用户名:<input type="text" name="username" value="${user.username }"/><br/>
密 码:<input type="password" name="password" value="${user.password }"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
欢迎界面
<body>
<h1>欢迎登录本系统</h1>
<c:choose>
<c:when test="${empty sessionScope.sessionUser }">滚!</c:when> //防止未登陆用户直接访问此页面。
<c:otherwise>
${sessionScope.sessionUser }
</c:otherwise>
</c:choose>
</body>