Web项目旅游网未完成

一、开发前操作

1.项目导入
点击绿色+按钮
在这里插入图片描述

选择travel项目的pom.xml文件,点击ok,完成项目导入。需要等待一小会,项目初始化完成。
在这里插入图片描述
我自己是直接从刚开始导入到项目中去,但是没有添加maven中pom.xml文件。

2启动项目
2.1 方式一:在maven界面项目travel中有plugins/tomcat7:run,然后双击就行。
在运行的时候如果出现报错:①Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile,这是因为在pom.xml中jdk版本不一样,进行更改。参照设置。②IDEA 启动报错:Error:(1, 1) java: 非法字符: ‘\ufeff‘参照进行设置,推荐第一个解决方案
在这里插入图片描述

2.2方式二:配置maven快捷启动
运行配置设置,点击加号,先选Tomcat,然后再进行Maven设置。
在这里插入图片描述
在这里插入图片描述
在这里基本就运行成功了,然后再浏览器输入localhost/travel,直接进入基本就完成了。

3技术选型
3.1Web层
a)Servlet:前端控制器
b)html:视图 是客户在网络浏览,不用JSP
c)Filter:过滤器
d)BeanUtils:数据封装
e)Jackson:json序列化工具
3.2Service层
f)Javamail:java发送邮件工具
g)Redis:nosql内存数据库
h)Jedis:java的redis客户端
3.3Dao层
i)Mysql:数据库
j)Druid:数据库连接池
k)JdbcTemplate:jdbc的工具

在这里基本是这一个项目前后端,所用到的技术。

二、开发过程

1.创建数据库
在创建数据库之前,要在resources/druid.properties中将信息写好,如数据库名称travel。然后在SQL图形化界面导入sql语句。
– 创建数据库
CREATE DATABASE travel;
– 使用数据库
USE travel;
–创建表
复制提供好的sql,在resources/travel.sql中全选,然后点击按钮进行运行。
在这里插入图片描述

2注册功能
2.1页面效果
在这里插入图片描述

2.2功能分析
在这里插入图片描述

2.3代码实现
2.3.1常用正则表达式
在这里需要补充一点正则表达式的知识。在微博中2021年3月10日。

2.3.2表单校验
提升用户体验,并减轻服务器压力。
//校验用户名
//单词字符,长度8到20位
function checkUsername() {
//1.获取用户名值
var username = KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲username").val(…/;

//3.判断,给出提示信息
var flag = reg_username.test(username);
if(flag){
//用户名合法
$("#username").css(“border”,"");
}else{
//用户名非法,加一个红色边框
$("#username").css(“border”,“1px solid red”);
}

         return flag;
     }

     //校验密码
     function checkPassword() {
         //1.获取密码值
         var password = $("#password").val();
         //2.定义正则
         var reg_password = /^\w{8,20}$/;

         //3.判断,给出提示信息
         var flag = reg_password.test(password);
         if(flag){
             //密码合法
             $("#password").css("border","");
         }else{
             //密码非法,加一个红色边框
             $("#password").css("border","1px solid red");
         }

         return flag;
     }

     //校验邮箱

function checkEmail(){
//1.获取邮箱
var email = KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲email").val(); …/;

//3.判断
var flag = reg_email.test(email);
if(flag){
$("#email").css(“border”,"");
}else{
$("#email").css(“border”,“1px solid red”);
}

return flag;
}

$(function () {
//当表单提交时,调用所有的校验方法
$("#registerForm").submit(function(){

             return checkUsername() && checkPassword() && checkEmail();
             //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交

});

         //当某一个组件失去焦点是,调用对应的校验方法
	$("#username").blur(checkUsername);
         $("#password").blur(checkPassword);
         $("#email").blur(checkEmail);


     });

2.3.3异步(ajax)提交表单
在此使用异步提交表单是为了获取服务器响应的数据。因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据。
serialize()
在这里插入图片描述

2.3.4后台代码实现
servlet会调用service ,service 要调用dao。
service要创建接口Userservice,然后再实现包下面imple中再写一个类UserServiceImpl去实现(implements)UserService的接口。
在dao中创建一个接口UserDao,在dao中impl包中创建一个实现类UserDaoImpl。
在这里插入图片描述
2.3.5编写RegistUserServlet
@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //验证校验
    String check = request.getParameter("check");
    //从sesion中获取验证码
    HttpSession session = request.getSession();
    String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
    session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
    //比较
    if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
        //验证码错误
        ResultInfo info = new ResultInfo();
        //注册失败
        info.setFlag(false);
        info.setErrorMsg("验证码错误");
        //将info对象序列化为json
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(info);
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(json);
        return;
    }

    //1.获取数据
    Map<String, String[]> map = request.getParameterMap();

    //2.封装对象
    User user = new User();
    try {
        BeanUtils.populate(user,map);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

    //3.调用service完成注册
    UserService service = new UserServiceImpl();
    boolean flag = service.regist(user);
    ResultInfo info = new ResultInfo();
    //4.响应结果
    if(flag){
        //注册成功
        info.setFlag(true);
    }else{
        //注册失败
        info.setFlag(false);
        info.setErrorMsg("注册失败!");
    }

    //将info对象序列化为json
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(info);

    //将json数据写回客户端
    //设置content-type
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write(json);


}

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

}

2.3.6编写UserService以及UserServiceImpl
public class UserServiceImpl implements UserService {

private UserDao userDao = new UserDaoImpl();
/**
 * 注册用户
 * @param user
 * @return
 */
@Override
public boolean regist(User user) {
    //1.根据用户名查询用户对象
    User u = userDao.findByUsername(user.getUsername());
    //判断u是否为null
    if(u != null){
        //用户名存在,注册失败
        return false;
    }
    //2.保存用户信息
    userDao.save(user);
    return true;
}

}

2.3.7编写UserDao以及UserDaoImpl
public class UserDaoImpl implements UserDao {

private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

@Override
public User findByUsername(String username) {
    User user = null;
    try {
        //1.定义sql
        String sql = "select * from tab_user where username = ?";
        //2.执行sql
        user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
    } catch (Exception e) {

    }

    return user;
}

@Override
public void save(User user) {
    //1.定义sql
    String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email) values(?,?,?,?,?,?,?)";
    //2.执行sql

    template.update(sql,user.getUsername(),
                user.getPassword(),
            user.getName(),
            user.getBirthday(),
            user.getSex(),
            user.getTelephone(),
            user.getEmail());
}

}

2.3.8邮件激活
为什么要进行邮件激活?为了保证用户填写的邮箱是正确的。将来可以推广一些宣传信息,到用户邮箱中。

2.3.9 发送邮件
1.申请邮箱
2.开启授权码
3.在MailUtils中设置自己的邮箱账号和密码(授权码)
在这里插入图片描述

邮件工具类:MailUtils,调用其中sendMail方法可以完成邮件发送

2.3.10 用户点击邮件激活
经过分析,发现,用户激活其实就是修改用户表中的status为‘Y’
在这里插入图片描述

分析:

在这里插入图片描述

发送邮件代码:
在这里插入图片描述
修改保存Dao代码,加上存储status和code 的代码逻辑
在这里插入图片描述
激活代码实现:
ActiveUserServlet
//1.获取激活码
String code = request.getParameter(“code”);
if(code != null){
//2.调用service完成激活
UserService service = new UserServiceImpl();
boolean flag = service.active(code);

//3.判断标记
String msg = null;
if(flag){
    //激活成功
    msg = "激活成功,请<a href='login.html'>登录</a>";
}else{
    //激活失败
    msg = "激活失败,请联系管理员!";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);

UserService:active
@Override
public boolean active(String code) {
//1.根据激活码查询用户对象
User user = userDao.findByCode(code);
if(user != null){
//2.调用dao的修改激活状态的方法
userDao.updateStatus(user);
return true;
}else{
return false;
}

}

UserDao:findByCode updateStatus

/**

  • 根据激活码查询用户对象

  • @param code

  • @return
    */
    @Override
    public User findByCode(String code) {
    User user = null;
    try {
    String sql = “select * from tab_user where code = ?”;

     user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),code);
    

    } catch (DataAccessException e) {
    e.printStackTrace();
    }

    return user;
    }

/**

  • 修改指定用户激活状态
  • @param user
    */
    @Override
    public void updateStatus(User user) {
    String sql = " update tab_user set status = ‘Y’ where uid=?";
    template.update(sql,user.getUid());
    }

3登录功能实现
3.1分析
在这里插入图片描述
3.2代码实现
3.2.1前台代码
在这里插入图片描述

3.2.2后台代码
LoginServlet
//1.获取用户名和密码数据
Map<String, String[]> map = request.getParameterMap();
//2.封装User对象
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

//3.调用Service查询
UserService service = new UserServiceImpl();
User u = service.login(user);

ResultInfo info = new ResultInfo();

//4.判断用户对象是否为null
if(u == null){
//用户名密码或错误
info.setFlag(false);
info.setErrorMsg(“用户名密码或错误”);
}
//5.判断用户是否激活
if(u != null && !“Y”.equals(u.getStatus())){
//用户尚未激活
info.setFlag(false);
info.setErrorMsg(“您尚未激活,请激活”);
}
//6.判断登录成功
if(u != null && “Y”.equals(u.getStatus())){
//登录成功
info.setFlag(true);
}

//响应数据
ObjectMapper mapper = new ObjectMapper();

response.setContentType(“application/json;charset=utf-8”);
mapper.writeValue(response.getOutputStream(),info);

UserService
public User login(User user) {
return userDao.findByUsernameAndPassword(user.getUsername(),user.getPassword());
}

UserDao
public User findByUsernameAndPassword(String username, String password) {
User user = null;
try {
//1.定义sql
String sql = “select * from tab_user where username = ? and password = ?”;
//2.执行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username,password);
} catch (Exception e) {

}

return user;

}

3.2.3index页面中用户姓名的提示信息功能
效果:
在这里插入图片描述
header.html代码
在这里插入图片描述
Servlet代码
//从session中获取登录用户
Object user = request.getSession().getAttribute(“user”);
//将user写回客户端

ObjectMapper mapper = new ObjectMapper();
response.setContentType(“application/json;charset=utf-8”);
mapper.writeValue(response.getOutputStream(),user);

4退出功能实现
什么叫做登录了?session中有user对象。
实现步骤:
1.访问servlet,将session销毁
2.跳转到登录页面
代码实现:
Header.html
在这里插入图片描述

Servlet:
//1.销毁session
request.getSession().invalidate();

//2.跳转登录页面
response.sendRedirect(request.getContextPath()+"/login.html");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值