JavaWeb学习笔记——黑马旅游网

《黑马旅游网》综合案例

 

目录

《黑马旅游网》综合案例

一、启动项目

二、技术选型

Web层

Service层

Dao层

三、创建数据库

四、注册功能

功能分析

代码实现

校验用户名

校验密码

校验邮箱

异步(ajax)提交表单

后台代码实现

发送邮件

五、登录

六、退出

七、旅游线路名称查询


一、启动项目

方式一:

 

方式二:配置maven快捷启动

 

二、技术选型

Web层

  1. Servlet:前端控制器
  2. html:视图
  3. Filter:过滤器
  4. BeanUtils:数据封装
  5. Jackson:json序列化工具

Service层

  1. Javamail:java发送邮件工具
  2. Redis:nosql内存数据库
  3. Jedis:java的redis客户端

Dao层

  1. Mysql:数据库
  2. Druid:数据库连接池
  3. JdbcTemplate:jdbc的工具

三、创建数据库

-- 创建数据库

CREATE DATABASE travel;

-- 使用数据库

USE travel;

--创建表

         复制提供好的sql

 

四、注册功能

功能分析

代码实现

<script>
    /*
        表单校验
            1.用户名:单词字符,长度8到20位
            2.密码:单词字符,长度8到20位
            3.email:邮件格式
            4.姓名:非空
            5.手机号:手机号格式
            6.出生日期:非空
            7.验证码:非空
    */

    //校验用户名
    function checkUsername() {
        alert("校验密码");
        return true;
    }

    //校验密码
    function checkPassword() {
        alert("校验密码");
        return true;
    }

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

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

        //当某一个组件失去焦点时,调用对应的校验方法
        $("#username").blur(checkUsername);
    })
</script>

校验用户名

//校验用户名
function checkusername() {
    //1.获取用户名值
    var username = $("#username").val();
    //2.定义正则
    var reg_username = /^\w{8,20}$/;
    //3.判断,给出提示信息
    var flag = reg_username.test(username);
    if (flag){
        //用户名合法
        $("#username").css("border","");
    }else {
        //用户名不合法,加一个红色边框
        $("#username").css("border","1px solid red");
    }
    return true;
}

校验密码

方法和校验用户名一样

校验邮箱

//校验邮箱
function checkEmail(){
    //1.获取邮箱
    var email = $("#email").val();
    //2.定义正则 itcast@163.com
    var reg_email = /^\w+@\w+\.\w+$/;
    //3.判断
    var flag = reg_email.test(email);
        if (flag){
            $("#email").css("border","");
        }else {
            $("#email").css("border","1px solid red");
        }
    return flag;
}

 

 

异步(ajax)提交表单

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

$(function () {
    //当表单提交时,调用所有的校验方法
    $("#registerForm").submit(function () {
        //1.发送数据到服务器
        if(checkUsername() && checkPassword() && checkEmail()){
            //校验通过,发送ajax请求,提交表单的数据
            $.post("registUserServlet",$(this).serialize(),function(data) {
                //处理服务器响应的数据  data 
            });
        }
        //2.跳转页面
        return false;
        //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回false,则表单不提交
});

后台代码实现

编写RegistUserServlet

package cn.itcast.travel.web.servlet;

import cn.itcast.travel.domain.ResultInfo;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //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);
    }
}

编写UserService以及UserServiceImpl

UserService

package cn.itcast.travel.service;

import cn.itcast.travel.domain.User;

public interface UserService {
    /**
     * 注册用户
     * @param user
     * @return
     */
    boolean regist(User user);
}

UserServiceImpl

package cn.itcast.travel.service.impl;

import cn.itcast.travel.dao.UserDao;
import cn.itcast.travel.dao.impl.UserDaoImpl;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;

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;
    }
}

编写UserDao以及UserDaoImpl

UserDao

package cn.itcast.travel.dao;

import cn.itcast.travel.domain.User;

public interface UserDao {
    /**
     * 根据用户名查询用户信息
     * @param username
     * @return
     */
    public User findByUsername(String username);

    /**
     * 用户保存
     * @param user
     */
    public void save(User user);
}

UserDaoImpl

package cn.itcast.travel.dao.impl;

import cn.itcast.travel.dao.UserDao;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

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 (DataAccessException e) {
            e.printStackTrace();
        }

        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()
                );
    }
}

验证码

        //验证校验
        String check = request.getParameter("check");
        //从session中获取验证码
        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);
            //将json数据写回客户端
            //设置content-type
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);
            return;
        }

register.html

$.post("registUserServlet",$(this).serialize(),function (data) {
	//处理服务器响应的数据  data
	if(data.flag){
		//注册成功,跳转成功页面
		location.href="register_ok.html";
	}else {
		//注册失败,给errorMsg添加提示信息
		$("#errorMsg").html(data.errorMsg);
	}
});

发送邮件

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

要在MailUtils中设置自己的邮箱账号和密码(授权码)

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

UserDaoImpl
package cn.itcast.travel.web.servlet;

import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/activeUserServlet")
public class ActiveUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //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);
        }
    }

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

五、登录

header.html代码

<script>
    $(function () {
        //1.给登录按钮绑定单击事件
        $("#btn_sub").click(function () {
            //2.发送ajax请求,提交表单数据
            $.post("loginServlet", $("#loginForm").serialize(), function (data) {
                if (data.flag) {
                    //登陆成功
                    location.href = "index.html";
                } else {
                    //登录失败
                    $("#errorMsg").html(data.errorMsg);
                }
            })
        })
    })


    //3.处理响应结果
</script>

Servlet代码

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从session中获取登录用户
        Object user = request.getSession().getAttribute("user");
        //将user写回客户端
        ObjectMapper mapper = new ObjectMapper();
        response.setContentType("application/json;charset=utf-8");
        mapper.writeValue(response.getOutputStream(),user);
    }

六、退出

什么叫做登录了?session中有user对象。

实现步骤:

 

 

     1.访问servlet,将session销毁

     2.跳转到登录页面

代码实现:

         Header.html

<div class="login">
            	
   <span id="span_username"></span>
   <a href="myfavorite.html" class="collection">我的收藏</a>
   <a href="javascript:location.href='exitServlet';">退出</a>
</div>

Servlet

七、旅游线路名称查询

查询参数的传递

在header.html中

$("#search-button").click(function () {
    //线路名称
    var rname = $("#search_input").val();

    var cid = getParameter("cid");
    // 跳转路径 http://localhost/travel/route_list.html?cid=5,拼接上rname=xxx
    location.href="http://localhost/travel/route_list.html?cid="+cid+"&rname="+rname;
});

在route_list.html

var cid = getParameter("cid");
 //获取rname的参数值
 var rname = getParameter("rname");
 //判断rname如果不为null或者""
 if(rname){
     //url解码
     rname = window.decodeURIComponent(rname);
 }

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP(JavaServer Pages)是一种服务器端的动态页开发技术,它可以将 Java 代码嵌入 HTML 页面中,从而实现动态页的生成。 JSP 的基本原理是将 JSP 页面翻译成 Servlet,在服务器端执行 Servlet 代码,再将执行结果返回给客户端。因此,我们在使用 JSP 开发页时,需要先了解 Servlet 的相关知识。 JSP 的语法基本上就是 HTML 标签加上 Java 代码。以下是一些基本的 JSP 标签: 1. <% ... %>:嵌入 Java 代码,可以用于定义变量、写循环、判断语句等。 2. <%= ... %>:输出 Java 代码的执行结果。 3. <%-- ... --%>:注释,不会被翻译成 Servlet。 4. <jsp:include ... />:包含其他 JSP 页面或 HTML 页面。 5. <jsp:forward ... />:将请求转发到其他资源(JSP 页面、Servlet 或 HTML 页面)。 6. <jsp:useBean ... />:创建 JavaBean 对象。 7. <jsp:setProperty ... />:为 JavaBean 对象设置属性。 8. <jsp:getProperty ... />:取得 JavaBean 对象的属性值。 在 JSP 页面中,我们还可以使用 EL 表达式和 JSTL 标签库来简化代码编写,提高开发效率。 EL(Expression Language)表达式是一种简化的表达式语言,可以用于取值、赋值、计算等操作。例如,${name} 表示取得名为 name 的变量的值。 JSTL(JavaServer Pages Standard Tag Library)是一套标签库,提供了循环、条件判断、格式化、国际化等常用功能的标签。例如,<c:forEach> 标签可以用于循环遍历集合,<c:if> 标签可以用于条件判断。 除了以上标签库,JSP 还支持自定义标签库。我们可以通过编写标签处理器来扩展 JSP 的功能。 JSP 的优点是可以将 Java 代码嵌入 HTML 页面中,使得页的开发更加灵活和方便。但是,由于 JSP 页面需要翻译成 Servlet,因此会增加服务器的负担和响应时间。此外,JSP 页面中夹杂着 Java 代码,也不利于代码的维护和调试。因此,在开发大型站时,建议使用 MVC 设计模式,将业务逻辑和视图分离,使得代码更加清晰和易于维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值