美文网首页
JavaEE学习day-51:整合项目案例

JavaEE学习day-51:整合项目案例

作者: 开源oo柒 | 来源:发表于2019-09-28 22:48 被阅读0次

一、实现的功能

1.项目介绍:

项目名称:
     尚学堂后台管理系统
项目需求:
     实现用户登录;
     实现用户退出;
     实现用户注册;

2.功能介绍:

用户登录:
     根据用户名和密码查询用户信息。查到则登录成功,查不到则登录失败。
用户退出:
     用户退回到登录页面,销毁session。
用户户注册:
     将用户注册信息插入数据库

3.数据库的设计:

用户表:t_user
    用户id:uid
    用户名:uname
    用户密码:pwd
    用户性别:sex
    用户年龄:age
    出生日期:birthday

4.SQL语句设计:

用户登录:
    select * from t_user where uname=? and pwd=?;
用户注册:
    insert into t_user values(default,?,?,?,?,?);

  • 代码实现:

使用的MySQL数据库。
可以使用语句或者客户端工具直接创建。

二、实现步骤

1.用户登录:

(1)用户点击登录发送请求到UserServlettomcat服务器接收到请求后调用UserServlet中service方法进行请求处理,并将封存了相关数据的request对象和response对象作为实参传递给service方法。
(2)在UserServlet中调用业务层方法进行登录业务处理。
(3)在业务层方法中调用Dao层方法完成数据库操作。
(4)完成功能跳转。

  • 登录的界面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!-- 
    添加前端代码书写插件
        插件在资料中,将查询包放到myEclipse的安装目录中的drops文件中,然后重启myEclipse即可。
        安装后快捷键为:ctrl+E
    模版套用:
        在自己的项目中创建模版对应的jsp文件
        将jsp文件中的basepath代码移动到其他位置
        然后将模版中的HTML代码整个复制到对应的jsp中
        然后将basepath在移动会head标签中
        将模版中的前端资源文件复制到webRoot下。
 -->
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
    content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="renderer" content="webkit">
<title>登录</title>
<link rel="stylesheet" href="css/pintuer.css">
<link rel="stylesheet" href="css/admin.css">
<script src="js/jquery.js"></script>
<script src="js/pintuer.js"></script>
</head>
<body>
    <div class="bg"></div>
    <div class="container">
        <div class="line bouncein">
            <div class="xs6 xm4 xs3-move xm4-move">
                <div style="height:150px;"></div>
                <div class="media media-y margin-big-bottom"></div>
                <form action="user" method="post">
                    <div class="panel loginbox">
                        <div class="text-center margin-big padding-big-top">
                            <h1>尚学堂后台管理中心</h1>
                        </div>
                        <!-- 声明java代码块 -->
                        <%
                            //获取session中 的标记
                            Object obj = session.getAttribute("flag");
                            if (obj != null) {
                                if ("loginFalse".equals((String) obj)) {
                        %>
                        <div style="text-align: center;color:red;">用户名或密码错误</div>
                        <%
                            } else if ("regSuccess".equals((String) obj)) {
                        %>
                        <div style="text-align:center;color:red;">用户注册成功</div>
                        <%
                            }
                            }
                            session.invalidate();
                        %>
                        <div class="panel-body"
                            style="padding:30px; padding-bottom:10px; padding-top:10px;">
                            <div class="form-group">
                                <div class="field field-icon-right">
                                    <input type="text" class="input input-big" name="uname"
                                        placeholder="登录账号" data-validate="required:请填写账号" /> <span
                                        class="icon icon-user margin-small"></span>
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="field field-icon-right">
                                    <input type="password" class="input input-big" name="pwd"
                                        placeholder="登录密码" data-validate="required:请填写密码" /> <span
                                        class="icon icon-key margin-small"></span>
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="field">
                                    <input type="text" class="input input-big" name="code"
                                        placeholder="填写右侧的验证码" data-validate="required:请填写右侧的验证码" />
                                    <img src="images/passcode.jpg" alt="" width="100" height="32"
                                        class="passcode" style="height:43px;cursor:pointer;"
                                        onclick="this.src=this.src+'?'">

                                </div>
                            </div>
                        </div>
                        <div style="padding:30px;">
                            <input type="submit"
                                class="button button-block bg-main text-big input-big"
                                value="登录">
                        </div>
                        <div style="font-size:15px;position: relative;left:350px ;top:-20px ;"><a href="reg.jsp">注册</a></div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</body>
</html>
jsp实现的登录界面
  • UserServlet
package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zlw.pojo.User;
import com.zlw.service.UserService;
import com.zlw.service.impl.UserServiceImpl;
/**
 *  用户登录:
 *  1、  用户点击登录发送请求到UserServlet
 *      tomcat服务器接收到请求后调用UserServlet中service方法进行请求处理,并将封存了相关数据的
 *      request对象和response对象作为实参传递给service方法
 *  2、在UserServlet中调用业务层方法进行登录业务处理
 *  3、在业务层方法中调用Dao层方法完成数据库操作
 *  4、完成功能跳转
 *  MVC分层开发:
 *      M:model  service层和dao层和实体类层
 *      V:view    视图层 jsp页面等
 *      C:controller 控制层  servlet
 * @author zhang
 *
 */
public class UserServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求编码格式
        request.setCharacterEncoding("utf-8");
        //设置响应编码格式
        response.setContentType("text/html;charset=utf-8");
        //获取请求信息
        String uname = request.getParameter("uname");
        String pwd = request.getParameter("pwd");
        //处理请求信息
//      System.out.println(uname+":"+pwd);
        //处理业务逻辑层
        UserService us = new UserServiceImpl();
        User user=us.getUserInfoService(uname, pwd);
//      System.out.println(user);
        //处理响应结果
            //创建session对象
        HttpSession hs = request.getSession();
        if (user!=null) {//登录成功
            //将用户信息存储在session中
            hs.setAttribute("user", user);
            //重定向到main.jsp
            response.sendRedirect("/project/main.jsp");
        } else {//登录失败
            hs.setAttribute("flag", "loginFalse");
            //重定向到login.jsp
            response.sendRedirect("/project/login.jsp");
        }
        
    }
}
  • JDBC数据库连接:
    (1)Dao
package com.zlw.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.zlw.dao.UserDao;
import com.zlw.pojo.User;
import com.zlw.util.DBUtil;

public class UserDaoImpl implements UserDao{
    /**
     * 查询用户信息
     */
    @Override
    public User getUserInfoDao(String uname, String pwd) {
        //声明jdbc变量
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        //声明变量
        User us= null;
        try {
            //创建连接
            conn = DBUtil.getConnection();
            //创建sql语句
            String sql="select * from t_user where uname=? and pwd=?";
            //创建slq命令对象
            ps=conn.prepareStatement(sql);
            //给占位符赋值
            ps.setString(1, uname);
            ps.setString(2, pwd);
            //执行sql命令
            rs = ps.executeQuery();
            //遍历rs
            while(rs.next()){
                //给变量赋值
                us=new User();
                us.setUid(rs.getInt("uid"));
                us.setUname(rs.getString("uname"));
                us.setPwd(rs.getString("pwd"));
                us.setSex(rs.getString("sex"));
                us.setAge(rs.getInt("age"));
                us.setBirthday(rs.getString("birthday"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            DBUtil.closeAll(rs, ps, conn);  
        }
        return us;
    }
    /**
     * 用户注册
     */
    @Override
    public int regUserInfoDao(String uname, String pwd, String sex, int age, String birthday) {
        //创建sql语句
        String sql = "insert into t_user values(default,?,?,?,?,?)";
        return DBUtil.executeDML(sql, uname,pwd,sex,age,birthday);
    }
}

(2)pojo:

package com.zlw.pojo;

public class User {
    private int uid;
    private String uname;
    private String pwd;
    private String sex;
    private int age;
    private String birthday;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd + ", sex=" + sex + ", age=" + age
                + ", birthday=" + birthday + "]";
    }
}

(3)Service业务处理:

package com.zlw.service.impl;

import com.zlw.dao.UserDao;
import com.zlw.dao.impl.UserDaoImpl;
import com.zlw.pojo.User;
import com.zlw.service.UserService;

public class UserServiceImpl implements UserService {
    //创建Dao层对象
    UserDao ud= new UserDaoImpl();
    //用户登录
    @Override
    public User getUserInfoService(String uname, String pwd) {
        //处理登录业务
        return ud.getUserInfoDao(uname,pwd);
    }
    //用户注册
    @Override
    public int regUserInfoService(String uname, String pwd, String sex, int age, String birthday) {
        //处理注册业务
        return  ud.regUserInfoDao(uname,pwd,sex,age,birthday);
    }
}

(4)Util工具类:

package com.zlw.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DBUtil {
    //声明全局变量记录jdbc参数
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    //使用静态代码块,在类加载时即完成对属性文件的读取
    static{
        //动态获取属性配置文件的流对象
        InputStream in=DBUtil.class.getResourceAsStream("/jdbc.properties");
        //创建Properties对象
        Properties p=new Properties();
        //加载
        try {
            p.load(in);//会将属性配置文件的所有数据存储到Properties对象中
            //将读取的jdbc参数赋值给全局变量
            driver=p.getProperty("driver");
            url=p.getProperty("url");
            username=p.getProperty("username");
            password=p.getProperty("password");
            //加载驱动
            Class.forName(driver);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //创建连接对象并返回
    public static Connection getConnection(){
        Connection conn=null;
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        return conn;
    }
    //关闭资源
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
        try {
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            stmt.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    //封装增加删除修改的通用工具方法
    /**
     * @param sql SQL语句
     * @param objs  SQL语句占位符实参,如果没有参数则传入null
     * @return 返回增删改的结果,类型为int
     */
    public static int executeDML(String sql,Object...objs){
        // 声明jdbc变量
                Connection conn = null;
                PreparedStatement ps = null;
                int i = -1;
                try {
                    // 获取连接对象
                    conn = DBUtil.getConnection();
                    // 开启事务管理
                    conn.setAutoCommit(false);
                    // 创建SQL命令对象
                    ps = conn.prepareStatement(sql);
                    // 给占位符赋值
                    if(objs!=null){
                        for(int j=0;j<objs.length;j++){
                            ps.setObject(j+1,objs[j]);
                        }
                    }
                    // 执行SQL
                    i = ps.executeUpdate();
                    conn.commit();
                } catch (Exception e) {
                    try {
                        conn.rollback();
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    e.printStackTrace();
                } finally {
                    DBUtil.closeAll(null, ps, conn);
                }
                return i;
    }
}

(5)jdbc.properties:配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/project
username=root
password=root
  • 登录成功的页面会跳转到mian.jsp: 登录成功
  • 登录失败会跳转到登录页面: 登录失败

2.退出登录:

  • OutServlet:
package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class OutServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求编码格式
        request.setCharacterEncoding("utf-8");
        //设置响应的编码格式
        response.setContentType("text/html;charset=utf-8");
        //获取请求信息
        //处理请求信息
        //获取session对象
        HttpSession hs = request.getSession();
        //销毁session
        hs.invalidate();
        //相应处理结果
            //重定向
            response.sendRedirect("/project/login.jsp");
        
    }
}

3.用户注册

package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zlw.service.UserService;
import com.zlw.service.impl.UserServiceImpl;

public class RegServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求编码格式
        request.setCharacterEncoding("utf-8");
        //设置响应编码格式
        response.setContentType("text/html;charset=utf-8");
        //获取请求信息
        String uname = request.getParameter("uname");
        String pwd = request.getParameter("pwd");
        String sex = request.getParameter("sex");
        int age = Integer.parseInt(request.getParameter("age"));
        String birthday = request.getParameter("birthday");
        //处理请求信息
            //获取业务层对象
            UserService us= new UserServiceImpl();
            int i = us.regUserInfoService(uname, pwd, sex, age, birthday);
            
        //处理响应结果
            //获得Session对象
            HttpSession hs = request.getSession();
        if(i>0){//注册成功
            //给注册成功添加标记到session中
            hs.setAttribute("flag","regSuccess");
            //重定向到登录页面
            response.sendRedirect("/project/login.jsp");
        }else{//注册失败
            //重定向到注册页面
            response.sendRedirect("/project/reg.jsp");
        }
    }

}
  • jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
    content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="renderer" content="webkit">
<title></title>
<link rel="stylesheet" href="css/pintuer.css">
<link rel="stylesheet" href="css/admin.css">
<script src="js/jquery.js"></script>
<script src="js/pintuer.js"></script>
<!-- 声明js代码域 -->
<script type="text/javascript">
    $(function(){
        //给男添加单机按钮
        $("#man").click(function(){
            //给男的span添加选择样式
            $("#manSpan").addClass("icon-check");
            //将女的选择状态去掉
            $("#womanSpan").removeClass("icon-check");
        //给女添加单机事件
        $("#woman").click(function(){
            //给女的span添加选择样式
            $("#womanSpan").addClass("icon-check");
            //将男的选择状态去掉
            $("#manSpan").removeClass("icon-check");
        })
            
        })
    })
</script>
</head>
<body>
    <div class="panel admin-panel">
        <div class="panel-head">
            <strong><span class="icon-key"></span> 会员注册</strong>
        </div>
        <div class="body-content">
            <form method="post" class="form-x" action="reg">
                <div class="form-group"></div>
                <div class="form-group">
                    <div class="label">
                        <label for="sitename">用户名:</label>
                    </div>
                    <div class="field">
                        <input type="text" class="input w50" id="uname" name="uname"
                            size="50" placeholder="请输入用户名" data-validate="required:请输入用户名" />
                    </div>
                </div>
                <div class="form-group">
                    <div class="label">
                        <label for="sitename">密码:</label>
                    </div>
                    <div class="field">
                        <input type="password" class="input w50" name="pwd" size="50"
                            placeholder="请输入新密码"
                            data-validate="required:请输入密码,length#>=5:密码不能小于5位" />
                    </div>
                </div>
                <div class="form-group">
                    <div class="label">
                        <label for="sitename">确认密码:</label>
                    </div>
                    <div class="field">
                        <input type="password" class="input w50"
                            size="50" placeholder="请再次输入密码"
                            data-validate="required:请再次输入密码,repeat#pwd:两次输入的密码不一致" />
                    </div>
                </div>
                
                <div class="form-group">
                    <div class="label">
                        <label for="sitename">年龄:</label>
                    </div>
                    <div class="field">
                        <input type="" class="input w50" id="age" name="age"
                            size="50" placeholder="请输入年龄" data-validate="required:请输入年龄,length#<=3:年龄不不合法""/>
                    </div>
                </div>
                <div class="form-group">
                    <div class="label">
                        <label for="sitename">出生日期:</label>
                    </div>
                    <div class="field">
                        <input type="date" class="input w50" id="birthday" name="birthday"
                            size="50" data-validate="required:请输入出生日期" />
                    </div>
                </div>
                <!-- 性别 -->
                <div class="form-group">
                    <div class="label">
                        <label>性别:</label>
                    </div>
                    <div class="field">
                        <div class="button-group radio">

                            <label class="button active" > 
                            <span class="icon-check" id="manSpan"></span> <input name="sex" value="1" id="man"type="radio" checked="checked">男
                            </label> 
                            <label class="button active" >
                            <span class="" id="womanSpan"></span> <input name="sex" value="0" id="woman"type="radio">女 
                            </label>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="label">
                            <label></label>
                        </div>
                        <div class="field">
                            <button class="button bg-main icon-check-square-o" type="submit">
                                提交</button>
                        </div>
                    </div>
            </form>
        </div>
    </div>
</body>
</html>
  • 实现效果 注册页面
    注册成功

三、实现动态调用请求处理

1.实现动态调用请求:

  • 问题:

现在我们一个请求或者一个独立的业务逻辑都单独进行一个Servlet的创建进行请求处理。但是一个网站的功能是非常的多,如果每个都创建单独的Servlet进行处理,这样造成Servlet过多。造成资源浪费。

  • 解决:

服务器在接收到浏览器发送的请求后,会调用对应的Servlet进行请求处理。
然后调用Servlet中的Service方法进行处理。
我们将不同功能的处理封装成对应的方法。
在service方法中调用其对应的功能处理方法进行请求处理。
这样Servlet我们只需要一个。
使用反射。

  • 注意:

请求中需要附带要执行的方法名称。

package com.zlw.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zlw.pojo.User;
import com.zlw.service.UserService;
import com.zlw.service.impl.UserServiceImpl;
/**
 * servlet创建一个,在service方法中动态的调用请求处理方法。
 * 注意:
 *  请求中需要附带要调用的方法名
 * @author zhang
 *
 */
public class DataServlet extends BaseServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求编码格式
        request.setCharacterEncoding("utf-8");
        //设置响应编码格式
        response.setContentType("text/html;charset=utf-8");
        //获取请求信息
        String methodName = request.getParameter("method");
        System.out.println("DataServlet.service(当前请求的方法名:)"+methodName);
        //调用方法处理请求(根据动态方法名调用方法---->反射)
        try {
            //反射获取方法所在的类的对象
            Class cs = this.getClass();
            //反射获取要被调用的方法对象
            Method m = cs.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
            //反射执行方法
            m.invoke(this,request,response);
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    public void userLogin(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //获取请求信息
                String uname = request.getParameter("uname");
                String pwd = request.getParameter("pwd");
                //处理请求信息
//              System.out.println(uname+":"+pwd);
                //处理业务逻辑层
                UserService us = new UserServiceImpl();
                User user=us.getUserInfoService(uname, pwd);
//              System.out.println(user);
                //处理响应结果
                    //创建session对象
                HttpSession hs = request.getSession();
                if (user!=null) {//登录成功
                    //将用户信息存储在session中
                    hs.setAttribute("user", user);
                    //重定向到main.jsp
                    response.sendRedirect("/project2/main.jsp");
                } else {//登录失败
                    hs.setAttribute("flag", "loginFalse");
                    //重定向到login.jsp
                    response.sendRedirect("/project2/login.jsp");
                }
                
    }
    public void userOut(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //处理请求信息
                //获取session对象
                HttpSession hs = request.getSession();
                //销毁session
                hs.invalidate();
                //相应处理结果
                    //重定向
                    response.sendRedirect("/project2/login.jsp");
                
    }
    public void userReg(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //获取请求信息
                String uname = request.getParameter("uname");
                String pwd = request.getParameter("pwd");
                String sex = request.getParameter("sex");
                int age = Integer.parseInt(request.getParameter("age"));
                String birthday = request.getParameter("birthday");
                //处理请求信息
                    //获取业务层对象
                    UserService us= new UserServiceImpl();
                    int i = us.regUserInfoService(uname, pwd, sex, age, birthday);
                    
                //处理响应结果
                    //获得Session对象
                    HttpSession hs = request.getSession();
                if(i>0){//注册成功
                    //给注册成功添加标记到session中
                    hs.setAttribute("flag","regSuccess");
                    //重定向到登录页面
                    response.sendRedirect("/project2/login.jsp");
                }else{//注册失败
                    //重定向到注册页面
                    response.sendRedirect("/project2/reg.jsp");
                }
    }
}

2.抽取BaseServlet类:

将Servlet中的Service方法抽取出来。

package com.zlw.servlet;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BaseServlet extends HttpServlet{
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求编码格式
                request.setCharacterEncoding("utf-8");
                //设置响应编码格式
                response.setContentType("text/html;charset=utf-8");
                //获取请求信息
                String methodName = request.getParameter("method");
                System.out.println("DataServlet.service(当前请求的方法名:)"+methodName);
                //调用方法处理请求(根据动态方法名调用方法---->反射)
                try {
                    //反射获取方法所在的类的对象
                    Class cs = this.getClass();
                    //反射获取要被调用的方法对象
                    Method m = cs.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
                    //反射执行方法
                    m.invoke(this,request,response);
                } catch (Exception e) {
                    e.printStackTrace();
                } 
    }
}
  • Servlet
package com.zlw.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zlw.pojo.User;
import com.zlw.service.UserService;
import com.zlw.service.impl.UserServiceImpl;
/**
 * servlet创建一个,在service方法中动态的调用请求处理方法。
 * 注意:
 *  请求中需要附带要调用的方法名
 * @author zhang
 *
 */
public class DataServlet extends BaseServlet {
public void userLogin(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //获取请求信息
                String uname = request.getParameter("uname");
                String pwd = request.getParameter("pwd");
                //处理请求信息
//              System.out.println(uname+":"+pwd);
                //处理业务逻辑层
                UserService us = new UserServiceImpl();
                User user=us.getUserInfoService(uname, pwd);
//              System.out.println(user);
                //处理响应结果
                    //创建session对象
                HttpSession hs = request.getSession();
                if (user!=null) {//登录成功
                    //将用户信息存储在session中
                    hs.setAttribute("user", user);
                    //重定向到main.jsp
                    response.sendRedirect("/project2/main.jsp");
                } else {//登录失败
                    hs.setAttribute("flag", "loginFalse");
                    //重定向到login.jsp
                    response.sendRedirect("/project2/login.jsp");
                }
                
    }
    public void userOut(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //处理请求信息
                //获取session对象
                HttpSession hs = request.getSession();
                //销毁session
                hs.invalidate();
                //相应处理结果
                    //重定向
                    response.sendRedirect("/project2/login.jsp");
                
    }
    public void userReg(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //获取请求信息
                String uname = request.getParameter("uname");
                String pwd = request.getParameter("pwd");
                String sex = request.getParameter("sex");
                int age = Integer.parseInt(request.getParameter("age"));
                String birthday = request.getParameter("birthday");
                //处理请求信息
                    //获取业务层对象
                    UserService us= new UserServiceImpl();
                    int i = us.regUserInfoService(uname, pwd, sex, age, birthday);
                    
                //处理响应结果
                    //获得Session对象
                    HttpSession hs = request.getSession();
                if(i>0){//注册成功
                    //给注册成功添加标记到session中
                    hs.setAttribute("flag","regSuccess");
                    //重定向到登录页面
                    response.sendRedirect("/project2/login.jsp");
                }else{//注册失败
                    //重定向到注册页面
                    response.sendRedirect("/project2/reg.jsp");
                }
    }
}

四、总结和项目缺陷

1.套用模板进行页面快速构建

(1)在自己的项目中创建jsp文件。
(2)然后将模板中的前端相关代码赋值到自己的jsp文件中。
(3)将静态资源复制到webRoot下。

2.MCV的开发模式:

M:model    service dao pojo
V:view    jsp css html
C:    controller servlet

3.Servlet+jsp+jdbc的功能开发流程

1.浏览器发起页面请求直接给jsp
2.浏览器发起功能请求给Servlet,Servlet调用service方法,service进行业务逻辑处理,service调用dao,dao层进行数据库操作(jdbc),dao层将处理结果返回给service,service再将结果返回给Servlet,(或者继续请求转发或者重定向)请求转发或者重定向给jsp,jsp作出页面响应。

4.request和session作用域的使用

request:请求转发的数据流转的载体。
session:重定向的数据流转的载体(但是session可以解决同一个用户的不同请求的数据共享问题)。

5.浏览器发起请求到服务器请求发起的方式

非ajax请求:
form表单提交:action数据提交地址,method:数据提交方式;
超链接标签:href为数据提交地址,可以直接使用“?”拼接请求数据,类似于form表单的get方式。
js中的Windows.location.herf:为数据提交地址,可以直接使用“?”拼接请求数据,类似于form表单的get方式。

  • 注意:

使用以上请求方式发起的请求,浏览器在接收到相应内容后,会将原有内容覆盖,显示响应结果。

6.BaseServlet的抽取和使用:

反射机制
抽象类
不希望该Servlet类被调用和响应。

7.项目缺陷:

(1)在jsp中获取从Servlet流转过来的数据特别麻烦;
(2)在jsp页面中使用java代码块进行逻辑处理书写和阅读极不方便;
(3)使用session进行数据流转是很方便的,但是session失效了,所有依赖session实现的功能都会出问题。
(4)响应结果都是覆盖原有内容显示给用户的

相关文章

网友评论

      本文标题:JavaEE学习day-51:整合项目案例

      本文链接:https://www.haomeiwen.com/subject/xzzructx.html