项目的搭建基本步骤
用户的一个功能,通常对应我们的一个业务方法
1.熟悉静态页面
2.使用Maven来创建工作,创建模块
根据三层架构来创建文件夹(再加上工具类,以及用户类)
3.准备工作 技术选型
(1)Web层
a)Servlet:前端控制器
b)html:视图
c)Filter:过滤器
d)BeanUtils:数据封装
e)Jackson:json序列化工具
(2)Service层
f)Javamail:java发送邮件工具
g)Redis:nosql内存数据库
h)Jedis:java的redis客户端
(3)Dao层
i)Mysql:数据库
j)Mybatis:对jdbc进行封装
4.配置依赖(通过Maven来导入相应的jar包)
pom.xml依赖
<dependencies>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--beanUtils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
<scope>compile</scope>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.3</version>
</dependency>
<!--javaMail-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
</dependency>
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
5.创建数据库,找到表与表之间的联系
6.搭建Mybatis
核心配置文件 SqlMapConfig.xml (核心 四大信息 )
映射文件 UserDao.xml (写sql语句的地方)
日志文件 log4j.properties
工具类 MySessionUtil
(在工具类中记得有ThreadLocal来减低耦合)
7.使用git来备份数据,init
git init 创建一个git
git config --global user.name 用户名( 输入你的账户)
git config --global user.Email 邮箱( 输入你的邮箱)
git status (要保存的已经更改的文件)
git add . (添加)
git commit -m " "( 提交,命名)
8.从登录开始分析(使用测试驱动开发)
9.根据三层架构,先从service层开始编写代码,然后是Dao层最后才是web层
web层是从浏览器拿到用户提交的数据
dao层是从数据库中拿出已经存在的用户数据
service层则是对web层还有dao层中拿到的数据进行处理,对编写其功能
所以先写service层,从service的测试开始开发
1.生成UserService与测试逻辑 com\zx\service\TestUserService.java
2.编写User对象类
com\zx\domain\User.java
3.编写UserDao方法与测试
com\wzx\dao\UserDaoTest.java
4.创建UserDao接口
src\main\java\com\wzx\dao\UserDao.java
public interface UserDao {
//select * from tab_user where username = 'jackhello'
User findByName(String name);
}
5.在UserDao.xml映射文件和SqlMapConfig.xml核心映射文件中加入相应代码,实现Mybits的配置,好对MySQL进行操作
6.Junit的注解(在对UserDao的测试中使用)
@Before:用来初始化@Test方法要使用到的资源
@After:用来释放资源
@Before ->@Test -> @After
10.编写UserService的login方法,并进行测试(模拟登录进行输入)
login方法是对来自浏览器的数据与从数据库查找的数据进行比较,从而到得一个code状态(用1,-1,-2,-3来表示不同的状态,1表示登录成功,-1表示未注册等等)
public int login(User user) {
UserDao userDao =MySessionUtils2.getSession().getMapper(UserDao.class);//内部就使用你编写接口来生成代理对象
User user1=userDao.findByName(user.getUsername());
if(user1==null){
return -1; //未注册
}
else {
if('Y'==user1.getStatus()){
if(user1.getUsername().equals(user.getUsername())&&user1.getPassword().equals(user.getPassword())){
return 1; //登录成功
}else{
return -2; //密码或者用户名错误
}
}else {
return -3; //没有激活
}
}
}
11.在web的开发
用浏览器来减少服务器的负担(在浏览器端进行格式判断),提升用户体验
(1).jQuery在登录页面判断数据的格式 ,使用正则表达式的test方法来判断格式
(2)在登录页面,jQuery发送ajax给serlvet,ajax 提交先给表单做拦截,如果是submit() 提交函数(使用条件 页面是带有submit按钮的form表单) return false来拦截
不是的话则用点击事件$().click(function(){},然后在用ajax提交
(3)编写LoginServlet
三个步骤 1.接受请求,获取参数 2.处理参数 3.把处理后的结果返回给浏览器
//接受请求获取参数
Map<String,String[]> map=request.getParameterMap();
User user=new User();
System.out.println(map);
try {
//参数一JavaBean 参数二map
BeanUtils.populate(user,map); //将map中的所有的参数赋值给JavaBean
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//处理参数
UserService userService=new UserService();
int code=userService.login(user);
//响应给浏览器 因为是ajax提交 所以响应json给浏览器
ResponseInfo responseInfo=new ResponseInfo();
responseInfo.setCode(code);
if(code==-1){
responseInfo.setData("用户不存在");
}else if (code==1){
responseInfo.setData("登录成功");
//查出用户数据
User user1=userService.findUserByName(user.getUsername());
//保存在session中
request.getSession().setAttribute("user",user1);
}
else if (code==-2){
responseInfo.setData("密码或者用户名错误");
}
else if (code==-3){
responseInfo.setData("没有激活");
}
//转化为json
String json=new ObjectMapper().writeValueAsString(responseInfo);
response.getWriter().println(json);
}
12.对代码进行测试,然后进行验证码部分
验证码(防止有人用程序进行暴力登录,判断是人还是程序)
在后台中生成check01 ,图片验证码,然后在从浏览器拿到输入的验证码 check02
用ajax提交,在登录的servlet中对两个进行处理
先从请求中获得check01,再从session(后台生成的)中获取check02,再把check02删除,最后进行比较判断
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务器通知浏览器不要缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setHeader("expires","0");
//在内存中创建一个长80,宽30的图片,默认黑色背景
//参数一:长
//参数二:宽
//参数三:颜色
int width = 80;
int height = 30;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色
g.setColor(Color.GRAY);
//填充图片
g.fillRect(0,0, width,height);
//产生4个随机验证码,12Ey
String checkCode = getCheckCode();
//将验证码放入HttpSession中
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
//设置画笔颜色为黄色
g.setColor(Color.YELLOW);
//设置字体的小大
g.setFont(new Font("黑体",Font.BOLD,24));
//向图片上写入验证码
g.drawString(checkCode,15,25);
//将内存中的图片输出到浏览器
//参数一:图片对象
//参数二:图片的格式,如PNG,JPG,GIF
//参数三:图片输出到哪里去
ImageIO.write(image,"PNG",response.getOutputStream());
}
/**
* 产生4位随机字符串
*/
private String getCheckCode() {
String base = "0123456789ABCDEFGabcdefg";
int size = base.length();
Random r = new Random();
StringBuffer sb = new StringBuffer();
for(int i=1;i<=4;i++){
//产生0到size-1的随机值
int index = r.nextInt(size);
//在base字符串中获取下标为index的字符
char c = base.charAt(index);
//将c放入到StringBuffer中去
sb.append(c);
}
return sb.toString();
}
13.对前端代码的进行完善
登录到这里就差不多了,根据三层架构来写,思路会清晰许多,但是还是会有许多的小bug,有时一个小小的bug就会要一个上午,头秃