1.搭建开发环境
1.1 导入项目所需的开发包
dom4j-1.6.1.jar
jaxen-1.1-beta-6.jar
commons-beanutils-1.8.0.jar
commons-logging.jar
jstl.jar
standard.jar
1.2 创建程序的包名
cn.itcast.domain
cn.itcast.dao
cn.itcast.dao.impl
cn.itcast.service
cn.itcast.service.impl
cn.itcast.web.controller
cn.itcast.web.UI (user interface)(放为用户提供用户界面的servlet)
cn.itcast.utils
junit.test
在web-inf\jsp目录,保存jsp页面
1.3 在类目录下面,创建用于保存用户数据的xml文件(users.xml)
2、开发实体user
private String id;
private String username;
private String password;
private String email;
private Date birthday;
3、开发dao
3.1 开发UserDaoXmlImpl
public void add(User user)
public User find(String username)
public User find(String username,String password)
3.2 抽取接口
3.3 开发工具类: XmlUtils
3.4 开发测试类
4、开发service(service 对web层提供所有的业务服务)
4.1 开发BusinessService
public void registerUser(User user) throws UserExistException
public User loginUser(String username,String password);
5、开发web层
5.1 开发注册
5.1.1 写一个RegisterUIServlet为用户提供注册界面,它收到请求,跳到register.jsp
5.1.2 写register.jsp
5.1.3 register.jsp提交请求,交给RegisterServlet处理
2、写WebUtils工具类,封装请求数据到formbean中
3、如果校验失败跳回到register.jsp,并回显错误信息
4、如果校验通过,调用service向数据库中注册用户
5.2 开发登陆
5.2.1 写一个LoginUIServlet为用户提供注册界面,它收到请求,跳到login.jsp
购物项:
1.1 导入项目所需的开发包
dom4j-1.6.1.jar
jaxen-1.1-beta-6.jar
commons-beanutils-1.8.0.jar
commons-logging.jar
jstl.jar
standard.jar
1.2 创建程序的包名
cn.itcast.domain
cn.itcast.dao
cn.itcast.dao.impl
cn.itcast.service
cn.itcast.service.impl
cn.itcast.web.controller
cn.itcast.web.UI (user interface)(放为用户提供用户界面的servlet)
cn.itcast.utils
junit.test
在web-inf\jsp目录,保存jsp页面
1.3 在类目录下面,创建用于保存用户数据的xml文件(users.xml)
2、开发实体user
private String id;
private String username;
private String password;
private String email;
private Date birthday;
3、开发dao
3.1 开发UserDaoXmlImpl
public void add(User user)
public User find(String username)
public User find(String username,String password)
3.2 抽取接口
3.3 开发工具类: XmlUtils
3.4 开发测试类
4、开发service(service 对web层提供所有的业务服务)
4.1 开发BusinessService
public void registerUser(User user) throws UserExistException
public User loginUser(String username,String password);
5、开发web层
5.1 开发注册
5.1.1 写一个RegisterUIServlet为用户提供注册界面,它收到请求,跳到register.jsp
5.1.2 写register.jsp
5.1.3 register.jsp提交请求,交给RegisterServlet处理
5.1.4 写RegisterServlet
1.设计用于校验表单数据RegisterFormbean2、写WebUtils工具类,封装请求数据到formbean中
3、如果校验失败跳回到register.jsp,并回显错误信息
4、如果校验通过,调用service向数据库中注册用户
5.2 开发登陆
5.2.1 写一个LoginUIServlet为用户提供注册界面,它收到请求,跳到login.jsp
5.2.2 login.jsp提交给LoginServlet处理登陆请求
校验:
/*
private String username; 用户名不能为空,并且要是3-8的字符 abcdABcd
private String password; 密码不能为空,并且要是3-8的数字
private String password2; 两次密码要一致
private String email; 可以为空,不为空要是一个合法的邮箱
private String birthday; 可以为空,不为空时,要是一个合法的日期
*
*/
public boolean validate(){
boolean isOk = true;
if(this.username==null || this.username.trim().equals("") ){
isOk = false;
errors.put("username", "用户名不能为空!!");
}else{
if(!this.username.matches("[a-zA-Z]{3,8}")){
isOk = false;
errors.put("username", "用户名必须是3-8位的字母!!");
}
}
if(this.password==null || this.password.trim().equals("")){
isOk = false;
errors.put("password", "密码不能为空!!");
}else{
if(!this.password.matches("\\d{3,8}")){
isOk = false;
errors.put("password", "密码必须是3-8位的数字!!");
}
}
//private String password2; 两次密码要一致
if(this.password2!=null){
if(!this.password2.equals(this.password)){
isOk = false;
errors.put("password2", "两次密码不一致!!");
}
}
//private String email; 可以为空,不为空要是一个合法的邮箱
// flx_itcast@sina.com.cn
if(this.email!=null){
if(!this.email.matches("\\w+@\\w+(\\.\\w+)+")){
isOk = false;
errors.put("email", "邮箱不是一个合法邮箱!!");
}
}
//private String birthday; 可以为空,不为空时,要是一个合法的日期
if(this.birthday!=null){
try{
DateLocaleConverter conver = new DateLocaleConverter();
conver.convert(this.birthday);
}catch (Exception e) {
isOk = false;
errors.put("birthday", "生日必须要是一个日期!!");
}
}
return isOk;
}
数据封装:
package cn.itcast.utils;
import java.util.Enumeration;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.BeanUtils;
public class WebUtils {
//把request对象中的请求参数封装到bean中
public static <T> T request2Bean(HttpServletRequest request,Class<T> clazz){
try{
T bean = clazz.newInstance();
//username=aa password=bb email=aa@sina.com
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String name = (String) e.nextElement(); //username=aaa password=123
String value = request.getParameter(name);
BeanUtils.setProperty(bean, name, value);
}
return bean;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String makeId(){
//UUID 128 36位字符
return UUID.randomUUID().toString();
}
}
购物车案例:
购物车:
package cn.itcast.domain;
import java.util.LinkedHashMap;
import java.util.Map;
//代表购物车
public class Cart {
//用于保存购物车中所有商品
private Map<String,CartItem> map = new LinkedHashMap();
private double price; //0
public void add(Book book){ //javaweb
CartItem item = map.get(book.getId());
if(item!=null){
item.setQuantity(item.getQuantity()+1);
}else{
item = new CartItem();
item.setBook(book);
item.setQuantity(1);
map.put(book.getId(), item);
}
}
public Map<String, CartItem> getMap() {
return map;
}
public void setMap(Map<String, CartItem> map) {
this.map = map;
}
public double getPrice() {
double totalprice = 0;
for(Map.Entry<String,CartItem> me : map.entrySet()){
CartItem item = me.getValue();
totalprice += item.getPrice();
}
return totalprice;
}
public void setPrice(double price) {
this.price = price;
}
}
购物项:
package cn.itcast.domain;
//cartItem代表某本书,并表示书出现多少次
public class CartItem {
private Book book;
private int quantity;
private double price;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getPrice() {
return book.getPrice()*this.quantity;
}
public void setPrice(double price) {
this.price = price;
}
}