最新版JavaEE&JavaWeb知识详解
前言
我们在学习一门新的技术时,想要真正掌握好它,便需要学习和了解其背后的知识以及遵从一些规范,这是不可或缺的一步。
在学习和了解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开发的一套规范标准。
名称 | 性质 | 公司 |
---|---|---|
JavaWeb | Java语言在Web服务的解决方案 | SUN公司 |
JavaEE | JavaWeb的企业版开发规范 | SUN公司 |
JavaSE | JavaWeb的标准版开发规范 | SUN公司 |
本文主要以JavaEE为主,因为其应用更加广泛,适合开发大型Web服务。后文均用JavaWeb表示JavaEE展开。
JavaWeb的框架
当然,JavaEE也有很多新的开发框架,例如SSM框架,即Spring+SpringMVC+Mybatis,还有SSH框架,即Struts+Spring+Hibernate。至于它们之间的知识点和区别,这里不做过多解释。前面提到的两种框架随着发展,已经被第三种全新的框架所影响,那就是SM框架,即SpringBoot+Mybatis。三种框架各有优缺点,我所学习和使用的是SM框架,因为这个框架几乎结合了前两者的优点,比较符合未来的发展潮流。
上面的三种框架都是一站式的Web服务框架,通俗点指用该框架开发出来的Web应用只能部署到一台服务器上。针对想实现对服务器集群灾难性数据转移及负载均衡等功能,自然是达不到标准的。比如只要部署了应用的该台服务器出现如宕机等灾难性事故时,业务只能中断;且一台服务器很难承受海量用户的请求导致的高并发处理,因此需要一个能做到高并发、高可用、负载均衡的分布式框架,于是Spring Cloud诞生了。
上述的4种框架均为微服务框架。SSH、SSM、SM三种一站式微服务框架也是各自有自己的优缺点,主要体现在对数据库访问的框架上,例如Mybatis和Hibernate两种数据库框架针对不同群体和业务有着不一样的选择,笔者较喜欢前者,如果你不想编写复杂的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有两种架构模式:
- AJAX架构:即异步
JavaScript
及XML
架构(Asynchronous Javascript And XML)。它是一种局部刷新数据的模式,优势在于不用刷新整个页面便能实现刷新局部页面来从Web源服务器获得新的数据的功能。
- MVC架构:即模型视图控制器架构(Model View Controller),它是一种同步刷新模式,也就是如果一个进程没有完成,则后续队列的进程需要等待该进程完成以后才能被调用执行,因此需要刷新整个页面来更新数据。这也导致页面可能会出现“白屏”的现象。
两种架构适用的场景不同,但是AJAX
架构的使用会更加广泛些。
JavaEE规范
想具备一个好的开发能力,应该学会遵从一定的规范标准,只有这样才能增加彼此代码之间的可移植性和避免自己踩坑,也能让自己写的项目更优雅、更有条理性。
文件结构
此处以IDEA所生成的文件结构作为例子,讲解javaWeb的一些基本文件规范:
-demo #项目名称
-src #项目资源目录,即所有代码及编译后的文件、库文件所在目录
-main #主文件夹
-java #存放各种后台的Java程序及Java包,例如Servlet等
-com.google #java文件包所在目录,此目录展开以后为三层
-resources #项目的配置文件目录
-webapp #应用程序目录
-META-INF #用于放置应用打包信息和配置信息的目录
-WEB-INF #用于放置应用文档信息及相关类库的目录
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);
}
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);
}
}
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() {
}
}
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 + "]";
}
}
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);
}
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);
}
}
对于后两层的目录结构为:
-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
2.对于resources
目录,一般是用来放置访问数据库信息的配置文件的目录,例如:
-resources #数据层配置文件目录
db.properties
其中db.properties
文件里可以如下:
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/users_google?characterEncoding=utf-8
username=root
password=Google.com123
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.在开发过程中,应尽量使用AJAX请求架构模式,这样可以加快应用的访问速度及减轻服务器的压力。
2.开发应以功能模块化、前后端分离、多线程处理、异步处理、通用接口开发等为原则,这样做的好处就是,便于维护、安全性高、可移植性强、效率高。
3.开发过程中的请求尽量交付给Servlet
处理,再由Servlet
分发或重定向给JSP
视图层,尽量避免用户直接访问JSP
文件,以保证网站的安全性。例如:
我们的登录页面由login.jsp
和LoginController.java
所控制,对应的Servlet
名为LoginController
,对应的url-pattern
为/login
则用户需请求如下URL地址进行登录:
https://www.google.com:443/login
该请求会被后台的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