Javaweb学习阶段总结(一)【IDEA_JAVA-WEB工程创建;入门Java-web工程(含数据库)的框架结构;网页用户注册功能实现代码】

文章目录

  • 使用IDEA创建Java-web工程快速入门
    • 初次使用的一些实用设置
    • 创建工程具体步骤
  • 入门Java-web工程(含数据库)的框架结构
    • 首先简要回顾JAVA中的interface和implement:
      • Interface(接口)
      • Implement
    • 进入正题:工程结构
      • 第一层
      • 第二层中的后端(src)
        • Java-web代码分层概要浅析&微软的 “三层架构”VS“MVC”
        • Bean类【属于"M"层】
        • DAO层
        • JDBCUntil【Java DataBase Connectivity utiliy】
        • Service 层
        • controller层(含servlet【Server Applet】 类)
  • “(一)”结束语:水平有限,尽请指正

引言
初学java web 时的过程记录、重要知识积累以及经验总结。
本次为web入门和完成网页注册功能的阶段。

使用IDEA创建Java-web工程快速入门

初次使用的一些实用设置

1、设置字体大小:登录界面的Configure【配置】—— Settings——Editor——Font
2、设置背景颜色:登录界面的Configure【配置】—— Settings——Editor——Color Scheme——General——Default【默认】
3、设置打开IDEA时的默认操作:登录界面的Configure【配置】—— Settings——Appearance&Behavior——System Settings

创建工程具体步骤

1、Create New Project
Javaweb学习阶段总结(一)【IDEA_JAVA-WEB工程创建;入门Java-web工程(含数据库)的框架结构;网页用户注册功能实现代码】_第1张图片点击方框操作;

2、给工程命名,注意选择路径时最好直接创建在盘根目录下;

3、配置Tomcat服务器
运行下拉框——> Edit Configuration【编辑配置】 ——>先点击右上角的绿色加号——> 在左侧选择Tomcat Sever——> Local
Javaweb学习阶段总结(一)【IDEA_JAVA-WEB工程创建;入门Java-web工程(含数据库)的框架结构;网页用户注册功能实现代码】_第2张图片redeploy【重新部署】

4、添加第三方依赖
1)先在WEB-INF文件夹下创建“lib”的文件夹(选择Directory),将自己需要的jar包添加到这个文件夹中(形成工程内部lib,而不用external);
2)再打开 Project Structure,部署这些包:
3)首先是点击左侧的Libraries,点击+,选择JAVA将之前加入“lib"的包导入,再将一些需要的external包导入,APPLY;
4)再选择左侧的Module, 在Dependencies勾选之前导入的jar包,APPLY;(还可以直接在Dependencies页面中点击右侧的绿色加号,选下拉框的第一个选项,手动添加jar包或者文件进入module)。

5、#配置输出文件夹“classes”
在idea中如果不修改class文件的输出路径的话,会默认在工程下创建一个“out文件夹”用来装编译的class文件[或者说是用来存放src目录下的文件(包括配置文件,只要在src目录下就会被加载到out里面)]。修不修改默认输出路径都可以,但修改编译文件的输出路径为WEB-INF下的classes似乎更规范?
下面提供修改方法的链接:
idea架构简述及输出文件配置.

5、#检查工程结构左侧的 Artifacts和Facets
Artifacts【人工品;artifact是一个项目资源的组合体。例如,一个已编译的java类的集合,一个已打包的java应用。】
和Facets【面;Facets表述了在Module中使用的各种各样的框架、技术和语言,这些Facets让IDEA知道怎么对待module内容,并保证与相应的框架和语言保持一致。】
下面提供 有关IDEA里Facets和Artifacts的讲解 的链接:
IDEA里Facets和Artifacts的讲解.

【注:能力有限,#号部分为不知是否必要的操作】

入门Java-web工程(含数据库)的框架结构

首先简要回顾JAVA中的interface和implement:

Interface(接口)

1、概念:
接口与类属于同一层次,实际上,接口是一种特殊的抽象类。
2、属性:
(1)一个接口中,所有方法为公开、抽象方法;所有的属性都是公开、静态、常量。
(2)一个类实现一个接口的格式: class IM implements IA{ }; 一个类实现接口,相当于它继承一个抽象类。
(3) 类必须实现接口中的方法,否则其为一抽象类。 实现中接口和类相同。
3、基础使用方法:
(1)接口中可不写public,但在子类中实现接口的过程中public不可省。
(2)一个类只能继承另外一个类,但是它可以继承多个接口,中间用“,”隔开。
(3)接口和接口之间可以定义继承关系,并且接口之间允许实现多继承。
(4)一个接口也可以“接”多个实现类,中间依旧是用“,”隔开
4、作用:
通过接口可以实现不同层次、不同体系对象的共同属性; 通过接口实现write once as anywhere.。( 以JAVA数据库连接为例子:JDBC制定标准;数据厂商实现标准;用户使用标准。)接口通常用来屏蔽底层的差异。 接口也因为上述原因被用来保持架构的稳定性。
接口详解.
接口类示例:

public interface Userdao {
    /***
     * 用户登陆的方法声明
     * @param user
     * @return
     */
    public User login(User user);
    /***
     * 用户注册的方法声明
     * @param user
     * @return
     */
    public boolean register(User user);
}

Implement

在java中implement是为了实现某个接口。
例如:

public class impleuser implements Userdao{
    @Override
    public User login(User user) {
        return null;
    }
            PreparedStatement pst = (PreparedStatement) conn.prepareStatement
                    ("insert into register values(?,?,?,?,?);");//?为占位符
            pst.setString(1, user.getUsername());//占位符索引从1开始!
            pst.setString(2, user.getSex());
            pst.setString(3, user.getPassword());
            pst.setString(4, user.getEmail());
            pst.setString(5, user.getTel());
            pst.executeUpdate();
            bool = pst.executeUpdate();
            conn.close();
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        if (bool == 0) {
            return false;
        }
        else return true;
    }
    }

extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了
比如:
class A extends B implements C,D,E

进入正题:工程结构

第一层

0、".idea"
1、out文件(或是WEB-INF下的“classes”)
存放编译时后的文件;实际运行的内容;内含src问价目录下的所有文件;不可编写
笔者好多次工程不能正常运行,且查找代码并无错误,报错与当前编写不符,就是因为out文件没有更新!
【希望有大佬留言帮忙解决这个问题】
2、src
后端文件
3、web
前端文件
4、External Libraries

第二层中的后端(src)

src标准架构示例
Javaweb学习阶段总结(一)【IDEA_JAVA-WEB工程创建;入门Java-web工程(含数据库)的框架结构;网页用户注册功能实现代码】_第3张图片
【注:在工程量较小时,将接口类和对应的实现类放在同一个层次的包目录下也无妨。示例中servlet包实际上也可以写成controller包(层)】

Java-web代码分层概要浅析&微软的 “三层架构”VS“MVC”

在软件体系架构设计中,分层式结构是最常见和重要的。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。这也是Java Web中重要的三层架构中的三个层次。区分层次的目的即为了“高内聚低耦合”的思想。
所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。

第一、数据访问层 即DAO【Data Access Object】层,主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。
第二、业务逻辑层 即service层 主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。
第三、界面层 即controller层或action层,主要表示WEB方式。如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。当逻辑层和数据处理层高度分离出servlet时,servlet可以看作是该controller层中用来接收请求和返回响应的中间层。

【注意将“三层架构”区分于传统的MVC架构,区别主要在于业务逻辑和controller上】

Model-View-Controller

  • M:模型层,主要是负责一些具体的业务逻辑的实现。
  • V:视图层,可以理解为JSP页面。
  • C:控制器层,用于接受页面请求与响应请求到JSP页面的控制机制。dao、servlet

相关链接: 浅谈JavaWeb项目代码如何分层.

【笔者认为Java-web入门时只需要有适当水平的代码分层意识即可(不要把整个后端都写在一个servlet里),工程量较小时疲于分层不仅没有实用价值还会浪费时间,况且日新月异中代码架构也是在不断发展和演变的,我们要就事论事、实事求是。】

Bean类【属于"M"层】

JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:

  • 这个Java类必须具有一个无参的构造函数
  • 属性必须私有化
  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范(set、get)。

入门的Java bean类为我们具体操作对象的实体化提供了一个类的模板;模板中含有私有数据成员本身,以及它们各自的读取、设置的公用方法。
代码示例:

public class User { private int id;
    private String username;
    private String password;
    private String sex;
    private String email;
    private String tel;
    public User(){
        super();
    }

//    public User(String tel, String name, String password, String sex , String email){
//        this.tel = tel;
//        this.username = name;
//        this.password = password;
//        this.sex = sex;
//        this.email= email;
//    }
   //1
    public String getSex()
    {
        return sex;
    }
    public void setSex(String sex1)
    {
        this.sex = sex1;
    }
//2
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String userName)
    {
        this.username = userName;
    }
//3
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
//4
    public String getEmail()
    {
        return email;
    }
    public void setEmail(String email) { this.email = email; }
//5
    public String getTel()
    {
        return tel;
    }
    public void setTel( String tel1)
    {
        this.tel=tel1;
    }

}

DAO层

释义见第一部分讲解,具体示例代码参见接口类与实现类部分的代码示例。

JDBCUntil【Java DataBase Connectivity utiliy】

Util是utiliy的缩写,是一个多功能、基于工具的包。
该工具类基于数据库类型的不同也会不同。
以mysql为例,贴出相关实现办法。


        Connection conn;
        //驱动
        String driver = "com.mysql.jdbc.Driver";
        //地址
        String addr = "jdbc:mysql://localhost:3366/test?useUnicode=true&characterEncoding=utf8";
        //用户名
        String username = "root";
        //密码
        String password = "";
        try {
            //加载驱动
            Class.forName(driver);

            //建立连接
            conn = (Connection) DriverManager.getConnection(addr, username, password);
            //判断是否连接
            if (!conn.isClosed()) {

                System.out.println("连接成功");
            }

Service 层

该层属于业务逻辑处理层,在本次的“用户注册”案例中的“userservice”类主要是一个服务于user-bean的类,在该类的register外层函数中创建了一个user的bean实体对象,并调用了该对象的所有设置数据的函数,这些“set”函数被嵌套在一个含有参数的外层函数中,外层函数负责向内层的set函数传递参数。
代码示例:

import bean.User;

public class serviceuser {
    public User register(String username, String sex, String password, String email, String tel){
        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setSex(sex);
        user.setEmail(email);
        user.setTel(tel);
        return user;   //※注意返回的是一个user的实体对象
    }
}

当然,更加规范的做法是向dao层那样用一个接口类和一个实现类的组合来完成上述处理。
这里的service逻辑处理只是入门的冰山一角,还不能明显体现出“逻辑”的处理,暂且只将它作为user的一个服务类即可。

controller层(含servlet【Server Applet】 类)

由于实例简单,在该工程的controller层中只有一个servlet类。
在前面已经说过,dao层将底层数据操作从servlet中分离出去,jdbcutil将数据库连接操作从servlet中分离出去,userbean和userservice的组合实现了实体类的定义和服务,
所以servlet应该更纯粹地专注于与前端的交互,充当界面层底端或是控制层顶端的角色,在其中运用doGet和doPost方法,实现:

  1. 客户端发送请求至服务器端;
  2. 服务器将请求信息发送至 Servlet;
  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  4. 服务器将响应返回给客户端。

Servlet 是在服务器(如Tomcat)上运行的小服务程序。

package controller;

import bean.User;
import dao.Userdao;
import dao.impleuser;
import service.serviceuser;

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(name = "register", urlPatterns = "/register")//类似于web.xml的功能
public class register extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email=request.getParameter("email");
        String tel=request.getParameter("tel");
        String sex = request.getParameter("sex");
        serviceuser servicer= new serviceuser();//创建实体服务类的对象
        User newuser=servicer.register(username,sex,password,email,tel);//调用该对象中的函数创建一个bean的实体对象
        System.out.println("1"+username);
        System.out.println("2"+password);
        System.out.println("3"+sex);
        System.out.println("4"+email);
        System.out.println("5"+tel);//测试用
        Userdao dao=new impleuser();//创建dao的对象
        dao.register(newuser);//实现对数据库的操作
        try {
            response.getWriter().print("后台接受成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

servlet在这里似乎体现了后端集成的功能

相关链接: doGet和doPost的区别.

“(一)”结束语:水平有限,尽请指正

2019年4月28日

你可能感兴趣的:(Javaweb学习阶段总结)