• JavaWeb&JavaEE重要基础知识


    前言

    我们在学习一门新的技术时,想要真正掌握好它,便需要学习和了解其背后的知识以及遵从一些规范,这是不可或缺的一步。


    在学习和了解JavaWeb&JavaEE重要基础知识时,您可以尝试使用IDEA开发JavaWeb项目来实践,这有利于您更加深刻地掌握JavaWeb开发技巧。

    使用IDEA开发JavaWeb教程【使用IDEA开发JavaWeb项目的基本配置


    下面,我们从多个方面来介绍有关JavaWeb及JavaEE的知识和规范。

    JavaWeb和JavaEE的区别

    这个问题可能很多人都不知道吧?到底两者的差别在哪。
    JavaWeb,即SUN公司(已被Oracle甲骨文公司收购)开发出来的针对Java在Web层面的解决方案。Java是一个老牌且历史悠久的语言,在各个方面的应用都有重要地位,比如APP、桌面端及Web服务器等。虽然有年轻且简单的PHP与之竞争,但是Java凭借其动态性及大公司持续维护的天然优势,PHP也很难取代之而独享天下。我们不能说PHP和Java哪种语言好,它们各自有自己的优缺点。但是对于大型的企业项目,Java自然是首选,因为其扩展性、安全性及规范性强,背后有大公司支持和维护,其常见容器Tomcat Server也由Apache团队持续维护,具有得天独厚的优势。

    JavaEE,全称叫Java Enterprise Edition,即Java企业级应用开发版本,不同于JavaSE(Java标准应用开发版本,全称叫Java Standard Edition),它是JavaWeb的一套专门针对企业开发的规范,而JavaWeb只是其中的框架。你可以简单理解为:JavaWeb是一套工具,而JavaEE是JavaWeb针对企业用户做Web开发的一套规范标准。

    名称性质公司
    JavaWebJava语言在Web服务的解决方案SUN公司
    JavaEEJavaWeb的企业版开发规范SUN公司
    JavaSEJavaWeb的标准版开发规范SUN公司

    本文主要以JavaEE为主,因为其应用更加广泛,适合开发大型Web服务。后文均用JavaWeb表示JavaEE展开。

    JavaWeb的框架

    当然,JavaEE也有很多新的开发框架,例如SSM框架,即Spring+SpringMVC+Mybatis,还有SSH框架,即Struts+Spring+Hibernate。至于它们之间的知识点和区别,这里不做过多解释。前面提到的两种框架随着发展,已经被第三种全新的框架所影响,那就是SM框架,即SpringBoot+Mybatis。三种框架各有优缺点,我所学习和使用的是SM框架,因为这个框架几乎结合了前两者的优点,比较符合未来的发展潮流。

    上面的三种框架都是一站式的Web服务框架,通俗点指用该框架开发出来的Web应用只能部署到一台服务器上。针对想实现对服务器集群灾难性数据转移及负载均衡等功能,自然是达不到标准的。比如只要部署了应用的该台服务器出现如宕机等灾难性事故时,业务只能中断;且一台服务器很难承受海量用户的请求导致的高并发处理,因此需要一个能做到高并发、高可用、负载均衡的分布式框架,于是Spring Cloud诞生了。
    上述的4种框架均为微服务框架。SSHSSMSM三种一站式微服务框架也是各自有自己的优缺点,主要体现在对数据库访问的框架上,例如MybatisHibernate两种数据库框架针对不同群体和业务有着不一样的选择,笔者较喜欢前者,如果你不想编写复杂的SQL语句,想使用自动配置功能,建议选择后者。

    JavaWeb模式

    JavaWeb通常有两种开发模式,即C/S模式和B/S模式,下面分别介绍这两种模式的区别:

    • B/S模式:即Browser/Server模式,指的是Web应用程序部署在Web Server上,用户通过浏览器客户端访问该Web服务器上的Web应用的运行模式。这种模式已经成为了主流,它的好处便是不需要用户安装形形色色的桌面软件,仅通过浏览器客户端便能使用不同平台的Web软件提供的服务。但缺点也很明显,便是对Server端的资源开销很大,需要很大的带宽和处理资源能力才能支撑大量用户的使用。
    • C/S模式:即Client/Server模式,指的是开发专门的桌面软件,用户需要安装不同的桌面软件,才能使用不同平台的Web服务。这样会导致用户电脑资源被不同软件所占用,对用户来说,无疑是一个巨大的成本。但是好处也很明显,便是访问体验要比B/S模式好得多,因为一些计算资源被写入了桌面软件,由用户的客户端分担了计算资源,Web服务器仅仅只用与用户进行数据交换即可,极大减轻了Web服务器的压力,稳定性和数据可靠性也会高很多。

    两种模式谁也没法取代谁,因为各自都有得天独厚的优势,因此针对不同业务和不同情况,开发者可自行选择其中一种模式来做。典型的例子便是QQ和网上银行。因为QQ的数据交换量及同时在线的用户量很大,如果使用B/S模式,那么腾讯公司运营QQ的成本将会很大。而网上银行需要保障数据的安全性,若采用C/S模式将代码写入桌面软件,会有被破解和数据丢失的可能性,增加了安全风险,且网上银行同时在线及数据交换量并不算大,因此采用B/S模式更适合。

    JavaWeb的架构

    JavaWeb有两种架构模式:

    1. AJAX架构:即异步JavaScriptXML架构(Asynchronous Javascript And XML)。它是一种局部刷新数据的模式,优势在于不用刷新整个页面便能实现刷新局部页面来从Web源服务器获得新的数据的功能。

    1. MVC架构:即模型视图控制器架构(Model View Controller),它是一种同步刷新模式,也就是如果一个进程没有完成,则后续队列的进程需要等待该进程完成以后才能被调用执行,因此需要刷新整个页面来更新数据。这也导致页面可能会出现“白屏”的现象。

    两种架构适用的场景不同,但是AJAX架构的使用会更加广泛些。

    JavaEE规范

    想具备一个好的开发能力,应该学会遵从一定的规范标准,只有这样才能增加彼此代码之间的可移植性和避免自己踩坑,也能让自己写的项目更优雅、更有条理性。

    文件结构

    此处以IDEA所生成的文件结构作为例子,讲解javaWeb的一些基本文件规范:

    -demo							#项目名称
    	-src						#项目资源目录,即所有代码及编译后的文件、库文件所在目录
    		-main  					#主文件夹
    			-java				#存放各种后台的Java程序及Java包,例如Servlet等
    				-com.google	 	#java文件包所在目录,此目录展开以后为三层
    			-resources			#项目的配置文件目录
    			-webapp				#应用程序目录
    				-META-INF 		#用于放置应用打包信息和配置信息的目录
    				-WEB-INF 		#用于放置应用文档信息及相关类库的目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    JavaWeb开发一般分为3层结构,分别是:

    • 表示层:JSP+HTML等;
    • 业务逻辑层:用于处理后台逻辑及与数据库、前端交互等:
      • 控制层:action;
      • 服务层:biz;
    • 数据访问层:用于与数据库的数据交互、封装及解包等:
      • 实体层:entity;
      • 持久层:dao。

    其中业务逻辑层及数据访问层都是放在Java包路径里的,路径和Java包的命名为:平台/公司顶级域名+功能层,见下述说明:

    1.对于com.google目录,一般是用来放置后台java文件的目录,展开后便为:com->google两层目录,命名方式一般以项目平台或公司的域名构成,例如这里是google公司开发的javaWeb项目的包名的路径。其中google目录下的子目录的命名便是以其功能有关,例如:

    biz目录:业务逻辑层下的服务层,目录为com\google\biz\*,Java包名为com.google.biz,该目录下放置着封装实体信息的java文件,例如:

    package com.google.biz.UserBiz;
     
    import com.google.entity.User;
     
    public interface UserBiz {
    	/**
    	 * 方法功能:用户登录
    	 * @param User user 用户实体(封装账户和密码)
    	 * @return User user 数据库中返回的实体(方便session保存)
    	 */
    	User userLogin(User user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    package com.google.biz.UserBizImpl;
     
    import java.sql.Connection;
    import com.google.biz.UserBiz;
    import com.google.dao.IUserDao;
    import com.google.dao.UserDaoImpl;
    import com.google.entity.User;
    import com.google.utils.DBHelper;
    
    public class UserBizImpl implements UserBiz {
    
    	private IUserDao iud = new UserDaoImpl();
     
    	@Override
    	public User UserLogin(User User) {
    		
    		Connection con = DBHelper.getConn();
    		//复杂处理  sql = select * from tb_User where username = ?
    		return iud.UserLogin(User);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    action目录:业务逻辑层下的控制层,目录为com\google\action\*,Java包名为com.google.action,该目录下放置着逻辑层的控制器,用于与前端及数据库的数据交互,例如:

    package com.google.action.LoginController;
    
    import java.io.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    
    @WebServlet(name = "LoginController ", value = "/LoginController")
    public class LoginController extends HttpServlet {
        private String message;
    
        public void init() {
            message = "Success!";
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html");
    
            // Hello
            PrintWriter out = response.getWriter();
            out.println("<html><body>");
            out.println("<h1>" + message + "</h1>");
            out.println("</body></html>");
        }
    
        public void destroy() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    entity目录:数据访问层下的实体层,目录为com\google\entity\*,包名为com.google.entity,用于放置数据的封装信息,例如:

    package com.goolge.entity.User;
    
    public class User {
     
    	private int userid;
    	private String username;
    	private String password;
    	private String usex;
    	private String uaddress;
    	private String utelphone;
    	private int urole;
    	private String udate;
     
    	public User() {
    		// TODO Auto-generated constructor stub
    	}
    	
    	public User(String username, String password) {
    		super();
    		this.username = username;
    		this.password = password;
    	}
     
    	public User(String username, String password, String usex, String uaddress, String utelphone, int urole, String udate) {
    		super();
    		this.username = username;
    		this.password = password;
    		this.usex = usex;
    		this.uaddress = uaddress;
    		this.utelphone = utelphone;
    		this.urole = urole;
    		this.udate = udate;
    	}
     
    	public User(int userid, String username, String password, String usex, String uaddress, String utelphone, int urole, String udate) {
    		super();
    		this.userid = userid;
    		this.username = username;
    		this.password = password;
    		this.usex = usex;
    		this.uaddress = uaddress;
    		this.utelphone = utelphone;
    		this.urole = urole;
    		this.udate = udate;
    	}
     
    	public int getUserid() { return userid; }
     
    	public void setUserid(int userid) { this.userid = userid; }
     
    	public String getUsername() { return username; }
     
    	public void setUsername(String username) { this.username = username; }
     
    	public String getPassword() { return password; }
     
    	public void setPassword(String password) { this.password = password; }
     
    	public String getUsex() { return usex; }
     
    	public void setUsex(String usex) { this.usex = usex; }
     
    	public String getUaddress() { return uaddress; }
     
    	public void setUaddress(String uaddress) { this.uaddress = uaddress; }
     
    	public String getUtelphone() { return utelphone; }
     
    	public void setUtelphone(String utelphone) { this.utelphone = utelphone; }
     
    	public int getUrole() { return urole; }
     
    	public void setUrole(int urole) { this.urole = urole; }
     
    	public String getUdate() { return udate; }
     
    	public void setUdate(String udate) { this.udate = udate; }
    
    	@Override
    	public String toString() {
    		return "User [userid=" + userid + ", username=" + username + ", password=" + password + ", usex=" + usex + ", uaddress=" + uaddress + ", utelphone=" + utelphone + ", urole=" + urole + ", udate=" + udate + "]";
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    dao目录:数据访问层下的持久层,目录为com\google\dao\*,Java包为com.google.dao,用于放置封装与数据库的数据增删查改等操作的Java文件,且封装成通用数据库访问API接口,例如:

    package com.google.dao.UserDao;
     
    import com.google.entity.User;
    /**
     * 数据访问层接口
     * @author Colyn(InetGeek)
     *
     */
    public interface UserDao {	
    	/**
    	 * 方法功能:用户登录
    	 * @param User user 用户实体(封装账户和密码)
    	 * @return User user 数据库中返回的实体(方便session保存)
    	 */
    	Users usersLogin(User user);
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    package com.google.dao.UserDaoImpl;
     
    import java.sql.ResultSet;
    import com.google.dao.UserDao;
    import com.google.entity.User;
    import com.google.utils.BaseDao;
    import com.google.utils.DBHelper;
     
    public class UserDaoImpl extends BaseDao implements UserDao {
     
    	@Override
    	public User UserLogin(User User) {
    		User u = null;//存储数据库中返出来的用户实体
    		//用户登录的sql语句
    		String sql = "select * from users where username = ? and password = ?";
    		//调用Basedao中的通用查询方法  返回一个结果集对象
    		ResultSet rs = this.executeQuery(sql, new Object[] {
    				User.getUsername(),
    				User.getPassword()
    		});
    		try {
    			//判断结果集是否存在记录
    			if(rs.next()) {//存在记录
    				u = new User(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getInt(7), rs.getString(8));
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			DBHelper.myClose(conn, ps, rs);
    		}
    		return u;
    	}
    	
    	public static void main(String[] args) {
    		User UserLogin = new UserDaoImpl().UserLogin(new User("admin", "123"));
    		System.out.println(UserLogin);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    对于后两层的目录结构为:
    -com			#顶级域名
    
    	-google		#公司/平台名
    	
    		-biz	#服务层
    			UserBizImpl.java
    			UserBiz.java
    			
    		-action	#控制层
    			LoginController.java
    			
    		-entity	#实体层
    			UserImpl.java
    			User.java
    			
    		-dao	#持久层
    			UserDao.java
    			UserDaoImpl.java
    			
    		-utils	#第三方工具,如连接池等
    			DBHelper.java
    			
    		-filter	#过滤器
    			FilterImpl.java
    			Filter.java
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.对于resources目录,一般是用来放置访问数据库信息的配置文件的目录,例如:

    -resources	#数据层配置文件目录
    	db.properties
    
    • 1
    • 2

    其中db.properties文件里可以如下:

    driverClass=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/users_google?characterEncoding=utf-8
    username=root
    password=Google.com123
    
    • 1
    • 2
    • 3
    • 4

    3.对于webapp目录,一般是用来放置JSP文件(表示层,如UI等)、应用配置文件、打包信息文件及静态资源文件的,例如:

    -webapp				#应用程序目录
    	login.jsp
    	index.jsp
    	error.jsp
    	...
    	
    	-res			#前端静态资源文件目录
    		-js			#js脚本文件目录
    			status.js
    			...
    			
    		-css		#层叠样式表文件目录
    			style.css
    			...
    			
    		-img		#图像资源目录
    			favicon.ico
    			...
    			
    	-META-INF		#应用打包配置、应用信息文件目录
    		manifest.MF
    		...
    		
    	-WEB-INF		#安全目录,用于存放应用页面配置文件、库文件、类文件等
    		web.xml		#应用页面配置文件
    		
    		-lib		#库文件目录
    			jstl.jar
    			mysql-connector-java.jar
    			...
    			
    		-classes	#前面的java目录下java文件编译得到的class文件存放目录
    			com.google.*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    开发规则

    1.在开发过程中,应尽量使用AJAX请求架构模式,这样可以加快应用的访问速度及减轻服务器的压力。

    2.开发应以功能模块化前后端分离多线程处理异步处理通用接口开发等为原则,这样做的好处就是,便于维护、安全性高、可移植性强、效率高。

    3.开发过程中的请求尽量交付给Servlet处理,再由Servlet分发或重定向给JSP视图层,尽量避免用户直接访问JSP文件,以保证网站的安全性。例如:
    我们的登录页面由login.jspLoginController.java所控制,对应的Servlet名为LoginController,对应的url-pattern/login则用户需请求如下URL地址进行登录:

    https://www.google.com:443/login
    
    • 1

    该请求会被后台的Servlet获取到,再将请求转发到或者直接重定向到login.jsp进行登录验证。

    4.在后端程序中应先通过用户访问URL地址发送GET方式请求到对应的Servlet,经过处理后将请求转发至对应的JSP,通过用户在JSP文件中通过POST方式请求其他的Servlet


    关注我一起学习更多有关JavaWeb的最新知识~
    本文属于作者自主知识产权的原创文章,如须引用、转载,请注明来源:

    版权声明:本文为CSDN博主「InetGeek」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_34532102/article/details/125431654

  • 相关阅读:
    通过HbuilderX启动 微信开发者工具
    CubeMX+VSCode+Ozone的STM32开发工作流(二)VSCode环境配置
    Net6集成Nacos实现服务注册
    .NET 部署 多域名 Https(SSL)通过代码方式
    云安全—集群攻击入口攻与防
    请求服务器数据API
    JavaSE之网络编程
    多功能投票系统(ThinkPHP+FastAdmin+Uniapp)
    如何组装一个注册中心
    数据结构-二叉排序树(建立、查找、修改)
  • 原文地址:https://blog.csdn.net/qq_34532102/article/details/125431654