MVC工程开发

JAVA后台

  • servlet(控制器)

  • service(服务逻辑)

  • dao(数据查询)

  • utils(工具类)

  • entity(实体类Bean)

servlet

控制器、过滤器等

主要用于进行页面数据转发,定向页面

  • 配置url

1、通过注释定义路径

@WebServlet("/servletname")

2、通过web.xml

<servlet>
      <servlet-name>UserServlet</servlet-name>
      <servlet-class>com.igeek.shop.web.servlet.UserServlet</servlet-class>
</servlet>

<servlet-mapping>
      <servlet-name>UserServlet</servlet-name>
      <url-pattern>/user</url-pattern>
</servlet-mapping>
  • Servlet内容

继承HttpServlet
public class UserServlet extends HttpServlet 
  • 一般只需重写doGet和doPost方法
  • url访问方式 - get|post请求
  • 在一个方法中调用另一个方法 - 只需在一个方法中可实现所有操作

一个对象对应一个Servlet - 区分不同的操作
例如地址中的method使用不同关键字,使用“”分割:
url?method=login | reg | logout

  • doGet/doPost内容

如果有使用中文的情况记得设置中文参数数据的编码方式

request.setCharacterEncoding("UTF-8");
  • 获取请求request参数数据 - 区分不同操作

//以登陆作为示例
String method = request.getParameter("method");
                                    //取出request中method后数据 
        if("login".equals(method)) {            //对数据进行判断以确定其流向
            login(request, response);
        } else if("reg".equals(method)) {
            reg(request, response);
        }
  • 构造login函数

private UserService userService = new UserService();//定义service类对象
protected void login(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //2:获取请求request参数数据        
                //?拼接参数数据    form表单中参数数据
        String userAccount = request.getParameter("userAccount");
        String password = request.getParameter("password");

         //3: 把数据带至数据库端实现数据操作   -  调用Service业务层对应的方法
        //System.out.println(userAccount + "\t" + password); 
        User user = userService.login(userAccount, password);//返回user对象
    }
  • Service内容

  • Service - 业务

  • 对象操作方法
  • 后台验证(金融、保险...)
  • 逻辑处理
  • 调用数据库层 - 实现数据具体操作
public class UserService {

    private UserDao userDao = new UserDao();//定义数据层对象
    
    public Userlogin(String userAccount, String password) {
        //4: 调用Dao数据层 - 实现数据库操作
        return userDao.login(userAccount, password);
    }   
}
  • dao内容

通过调用utils中的工具类,实现对应数据库中数据操作

public class UserDao {

    public Userlogin(String userAccount, String password) {
        Connection con = DBUtil.getConnection();//工具类utiles中方法--连接数据库
        PreparedStatement stmt = null;//初始化查询语句
        ResultSet rs = null;
        User user = null;
        //5: 定义出sql语句
        String sql = "select * from user where userName = ? and password = md5(?)";
        try {
            stmt = con.prepareStatement(sql);       //Connection获取语句处理
            //若sql中有?参数  - 设置?对应的数据    setType(index, value)  index - 从1开始
            stmt.setString(1, userAccount);
            stmt.setString(2, password);
            
            /*
             * 执行ARUD   
             *  executeQuery()   -  select  
             *  executeUpdate()  -  insert、 update、 delete
             */
            rs = stmt.executeQuery();
            
            /*
             * 对查询的结果处理 - 数据封装为对象       
             *  rs.next()   - boolean
             *  rs.getType(index|列名)
             */
            if(rs.next()) {
                user = new User();
                user.setUserId(rs.getInt("userid"));    //结果集处理 - 每个列数据封装至对象
                user.setUserName(rs.getString(2));
                user.setSex(rs.getString("sex"));
                user.setEmail(rs.getString("email"));
                user.setName(rs.getString("name"));
                user.setBirthDay(rs.getDate("birthDay"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {     //关闭数据库相关操作
            DBUtil.allClose(rs, stmt, con); 
        }
        return user;
    }
    
}
  • 工具类

两种方法
JDBC - API
  • 物理连接操作
  • 加载数据库驱动jar - 拷贝至WEB-INF/lib中
  • 加载驱动程序类
  • DriverManager.getConection()
  • 关闭相关操作
数据库连接池
public class DBUtil {

    private static Connection connection;
//jdbc方法    
//  public static Connection getConnection() {
//      try {
//          Class.forName("com.mysql.jdbc.Driver");
//          connection = DriverManager.getConnection("jdbc:mysql://192.168.12.2:3306/ebuy", 
//                                                   "igeek", "igeek");
//      } catch (ClassNotFoundException e) {
//          e.printStackTrace();
//      } catch (SQLException e) {
//          e.printStackTrace();
//      }
//      return connection;
//  }
    
    private static DataSource dataSource=null;
    static{
        dataSource = new ComboPooledDataSource("mysql");        
                                //读取配置文件 - 读取mysql相关配置
    }
    
    /**
     * 获取数据库连接
     * @return
     */
    public static Connection getConnection(){
        try {
            connection = dataSource.getConnection();        //获取连接池中的一个连接
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    
    /**
     * 关闭数据库相关操作
     *  ResultSet - select查询的结果集
     *  PreparedStatement   - 语句处理  java语句转换为数据库中可执行的sql语句
     */
    public static void allClose(ResultSet rs, PreparedStatement stmt, Connection con) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
}
  • entity类(Bean实体)

  • Java实体对象 - 表
  • JavaBean定义
  • private的属性 + setter与getter方法
  • 无参构造器
  • 实现序列化 - 给定唯一系列化UID
  • 网络、文件传递存储对象
public class User implements Serializable {

    private static final long serialVersionUID = 1520708863050632827L;
    private int userId;
    private String userName;        //用户名
    private String password;
    private String sex;
    private String email;
    private String name;            //姓名
    private Date birthDay;

          //Get和Set方法省略
}
  • Servlet对查询回传数据进行处理

    protected void login(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        ........
        //6:对返回的结果进行处理 - 依据流向  - 跳转至下一个显示页面
        if(user == null) {  //用户名或密码错误
            /*
             * 传递页面所需数据
             *  request  -  数据只在下一个页面中使用  - 必须结合forward跳转
             *  session  
             *      setAttribute("name", value)
             */
            request.setAttribute("info", "用户名或密码错误!"); 
            //跳转至下一个url对应的页面
            request.getRequestDispatcher("/login.jsp").forward(request, response); 
        } else {
            /*
             * 数据在多个页面中使用
             *  session - 当前用户  - 跨页面数据传递
             */
            HttpSession sesison = request.getSession();
            sesison.setAttribute("user", user); 
            
            //无request传递数据 - 都可以
//          request.getRequestDispatcher("/index.jsp").forward(request, response); 
            response.sendRedirect(request.getServletContext().getContextPath() + "/index.jsp");     
                                  //    登陆成功跳转至主页面
        }
    }
  • 页面回收Info信息并显示错误

<div class="col-sm-6" id="logintip" style="color: red; font-size: 13px;">
    <%-- 
          %= 对象不存在显示
          nullEL表达式显示空
    --%>
    &nbsp;${requestScope.info}
</div>
  • EL表达式

<%-- Jsp注释 - 即可注释java部分也可注释html部分 
    
      ${内置对象.name}
        requestScope
        sessionScope    -  获取servlet传递的setAttribute的数据
                
                若name的值为基本类型或String  - 直接 内置对象.name
                若name的值为实体对象   内置对象.name.属性
            
        pageContext -  获取jsp内置对象
                ${pageContext.request.contextPath}    web上下文 /项目名称
 --%>

源码:
链接: https://pan.baidu.com/s/17FPGWghph1qkNZiPn_6uIA 密码: teje

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容