个人博客项目总结

**项目描述:**个人博客实现了登录,发送新文章,删除,修改,并支持上传图片的功能。
使用的技术有:
1.maven:使用maven打包项目,来管理依赖。
2.MySQL:使用数据库存储用户信息及文章列表,通过JDBC技术连接数据库。
3.前端编写:使用html和ajax技术来编写前端页面。
4.servlet:每个页面请求后端数据都需要实例servlet。
5.tomcat:使用tomcat作为web项目部署服务器
6.session:保持前后端会话的技术,需要登陆后才可以访问敏感资源。
7.:请求数据是json类型需要进行反序列化,响应给客户端将java对象序列化为json字符串。
8:模板设计模式,减少代码冗余。
9.filter程序是一个实现了特殊接口的java类,也是在tomcat服务器进行调用和执行的。在web.xml文件中配置filter来对某个servlet程序进行拦截,当servlet容器开始调用某个servlet程序时,如过发现已经注册了一个filter程序对servlet进行拦截,那么容器不会调用servic方法,而是调用filter的doFilter方法,但dofilter方法也是不能直接调用servlet的service的方法,而是由doFIlter方法中的FilterChain.doFilter方法,filterChain对象是由filter方法传参进来的。
10.富文本编辑器:是可内嵌于浏览器,所见即所得的文本编辑器。
项目整体思路
1.输入url后客户端发向服务端发出请求,映射login.html资源,渲染成登录网页。具体图片如下:
在这里插入图片描述
2.当在文本框中输入用户名和密码后会发生第二次ajax请求,请求到后端资源(使用注解)LoginServlet.java.,后端返回json数据需要将其序列化成为字符串返回给前端。代码实现

//页面加载完成以后执行function代码
$(function () {
    //jquery,使用$("#id")通过元素id获取某个页面元素
    $("#login_form").submit(function () {
        //ajax自己发请求
        $.ajax({
            url: "../login",//请求的服务路径
            type: "post",//请求方法
            // contentType: "",//请求的数据类型:请求头Content-Type,默认表单格式,json需要指定为json
            data: $("#login_form").serialize(),//请求数据:使用序列化表单的数据
            dataType: "json",//响应的数据类型:使用json要指定
            success: function (r) {//响应体json字符串,会解析为方法参数
                if(r.success){
                    //前端页面url直接跳转某个路径
                    window.location.href = "../jsp/articleList.jsp";
                }else{
                    alert("错误码:"+r.code+"\n错误消息:"+r.message)
                }
            }
        })

        //统一不执行默认的表单提交
        return false;
    })
})

返回给前端后通过r.sunccess方法决定重定向到那个界面

@WebServlet("/login")
public class LoginServlet extends AbstractBaseServlet{
    @Override
    protected Object process(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        User user= LoginDAO.query(username);
        if(user==null){
            throw new AppException("LOG002","用户名不存在");
        }
        if(!user.getPassWord().equals(password)){
            throw new AppException("LOG003","用户名或密码错误");
        }
        return null;
    }
}

这里实现servlet使用了模板设计模式,因为不止是登录接口,还有其他功能如增加文章,删除,修改等都需要先去设置请求体编码,响应体编码,响应的数据类型,而且不同的servlet出现的错误不同,如数据库连接失败,获取密码失败,等等所以又使用了自定义异常类模板方法,具体到每个细节中出现的问题具体抛出出现的错误。servlet模板和自定义异常模板代码实现:


public abstract class AbstractBaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求体编码
        req.setCharacterEncoding("UTF-8");
        //设置响应体编码
        resp.setCharacterEncoding("UTF-8");
        //设置响应体的数据类型(浏览器采用什么方式访问)
        resp.setContentType("application/json");
        //session会话管理,除登录注册接口,其他都需要登录后访问
        //req.getServletPath();//获取请求服务路径
        //TODO
        JSONResponse json=new JSONResponse();
        try{
            //调用父类方法重写
            Object data=process(req,resp);
            //子类方法process执行完没有异常,表示业务成功
            json.setSuccess(true);
            json.setData(data);
        }catch (Exception e){
            //自定义异常处理
            e.printStackTrace();
            //json.setSucess(false),默认
            String code="UNKNOWN";
            String s="未知错误";
            if(e instanceof AppException){
                code=((AppException) e).getCode();
                s= e.getMessage();
            }
            json.setCode(code);
            json.setMessage(s);
        }
        PrintWriter pw=resp.getWriter();
        pw.println(JSONUtil.serialize(json));
        pw.flush();
        pw.close();
    }
    protected abstract Object process(HttpServletRequest req, HttpServletResponse resp) throws Exception;
//这个方法就是每个sevlet具体实现的子类
}

//这个是用来处理每个错误具体细节的自定义类

/**
 * 自定义异常:业务代码自定义异常或其他异常
 */
public class AppException extends RuntimeException {
    //给前端返回的json字符串中,保存错误码
    private String code;
    public AppException(String code,String message) {
        super(message);
        this.code=code;
    }

    public AppException(String code,String message, Throwable cause) {
        super(message, cause);
        this.code=code;
    }

    public String getCode() {
        return code;
    }
}

登陆进去会出现如下画面
在这里插入图片描述
在实现增加文章和修改文章,删除文章servlet,效果图如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值