JAVAEE从何而来
在2004年底中国软件技术大会Ioc微容器(也就是Jdon框架的实现原理)演讲中指出:我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本.此次J2EE改名为Java EE,实际也反映出业界这种共同心声。
Java EE的核心是EJB3.0, 其提供了更兼便捷的企业级的应用框架。
为什么有JAVA2E
先知道B/S 和 C/S的区别
-
B是英文单词“Browser”的首字母,即浏览器的意思;S是英文单词“Server”的首字母,即服务器的意思。B/S就是“Browser/Server”的缩写,即“浏览器/服务器”模式。
比如浏览器浏览页面就是B/S -
C是英文单词“Client”的首字母,即客户端的意思,C/S就是“Client/Server”的缩写,即“客户端/服务器”模式
比如 手机的微信 QQ 游戏等app就是C/S
B/S维护升级容易
目前所有的B/S系统应用可以分为:有状态(statefull)和无状态(stateless)两大类别。 有状态是指在整个系统的处理过程中要保留记住一些信息,而无状态则相反,每次request都是独立的连接,不需要在每个request之间共享数据等等。
对于这两种应用,通常第一考虑是性能要最优,性能是我们选择IT技术的主要依据之一。
为达到最大化的性能,对于Java系统,以前通常的作法是使用对象池,这样节约对象生成时的性能开销,也就是说系统启动时,预先生成一定数目的对象实例在内存中,需要使用时,从对象池中取出实例,用完,归还对象池,对于有状态的应用,可以使用相关持久化(persistence)策略来保存状态。
下一步,如何并行访问对象池将是非常重要,java的多线程技术为我们提供了实现可能,线程的创建销毁也是可能非常耗时的,那么,无疑象使用对象池一样,我们必须使用线程池来实现多线程并行计算的最优化。
使用线程池和对象池,每次客户端请求发生一次就从线程池中借用一个线程,处理完这个请求就将线程返回线程池,同样,使用线程快速的访问对象,对象也是从对象池中借用,用完就还回对象池。 整个这样的架构设计在性能上是最优的。
有了性能保证,安全机制、事务机制、集群(cluster)技术也将是选择IT技术的主要依据。
J2EE就是这样一个实现上述多种考量的综合标准框架系统,在具体使用中,也许我们对所有这些考量的要求并不都一样重视,比如:如果纯粹追求性能是第一,可以忽视事务机制,那么,完整的J2EE技术也许就并不适合你。
那么我们先看看J2EE是如何从性能上保证我们的应用系统以最快速度运行的,也就是说J2EE中必然应该有上述线程池和对象池的实现技术,servlet实际是基于线程池的更好的线程容器;EJB是基于对象池的更好的对象容器。
1 JAVAEE 示意图
ejb既是J2EE的一种规范,又是一个特殊的java类(API、IDL一样,既是一个规范,又是一个实现)给一个类贴上规范化的标签就成了EJB类或者叫ejb组件,这种特殊的类需要一个更特殊的类来管理,以用来控制很多个我们自己建立的ejb类,这个更特殊的ejb类,我们可以称之为ejb容器,也可以叫做ejb组件、中间件都可以拿来叫,只不过概念侧重点不同。容器负责一些与业务逻辑无关而必须的功能,如事务、日志、安全、管理EJB和servlet的生命周期、数据库连接池、数据持久化等公共的服务,使得我们把主要精力放在业务逻辑上。
什么是容器?
提供创建、保持、销毁JavaEE对象的运行时环境,称之为容器。
与应用服务器的区别:
应用服务器除了提供容器支持之外,还会有管理模块等辅助功能,所以容器是应用服务器的一部分。在开发阶段,我们可以广义的认为容器就是应用服务器。
JavaEE的两类容器:
- Servlet容器:包括JSP与Servlet组件,可使用EJB中的组件完成复杂的业务逻辑。
- EJB容器:包含Servlet容器的所有功能,外加EJB组件的支持。
常用的容器:
支持Servlet容器的应用服务器有:Tomcat,Jetty
支持EJB容器的应用服务器有:Websphere、WebLogic、JBoss
什么是业务逻辑:
不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑。业务逻辑是指一个实体单元为了向另一个实体单元提供服务,应该具备的规则与流程。
在软件系统架构中,软件一般分为三个层次:表示层、业务逻辑层和数据访问层:
- 表示层:负责界面和交互;
- 业务逻辑层:负责定义业务逻辑(规则、工作流、数据完整性等),接收来自表示层的数据请求,逻辑判断后,向数据访问层提交请求,并传递数据访问结果,业务逻辑层实际上是一个中间件,起着承上启下的重要作用;
- 数据访问层:负责数据读取
业务逻辑的内容包括四个部分:
- 领域实体:定义了业务中的对象,对象有属性和行为;
- 业务规则:定义了需要完成一个动作,必须满足的条件;
- 数据完整性:某些数据不可少;
- 工作流:定义了领域实体之间的交互关系。
session和cookie
- 服务端会话
特点
服务器端存储:Session保存在服务器端,与cookie相比更加安全。
-
数据共享:Session可以给一组请求共享,解决了跨请求之间传递数据的问题。
-
时效性:Session有超时机制,一定时间内没有请求访问就会被自动清理,每个应用可以根据自己的需求在应用内部配置(Tomcat默认30分钟)。
- cookie
Cookie的特点:
服务器端生成,浏览器端保存
服务器端生成,但并不保存;会随着请求的响应,返回给浏览器端,浏览器端负责保存。
自由的时效性,可以长期有效
cookie生成时,服务器端就设置了expire时间,到达指定时间就自动失效;也可以不设置,只要不手工清理浏览器缓存和禁用cookie,cookie可以一直存在。
针对网址自动提交给网站
只要本地保存了cookie,以后再访问这个网站的任何链接,该cookie都会随着请求发送到网站上。
2 Servlet
servlet是一个规范也包含了其他相关内容,在servlet的容器中有四大组件
-
Servlet
-
Filter
-
Listener
-
ServletContext
我们来联系一个实例:
比如现在我们要帮一个餐厅做一个网页
1 eclipse 创建一个工程
勾选"Generate web.xml deployment descriptor”,然后点击“Finish”
然后会得到一个这样的目录
- 创建一个名为com.sgm.devtraining.servlet的包。
在Eclipse左侧的Project Explorer中选中MyRestaurant工程,右键new->Class,会跳出如下的弹框。 - 在Package中选择前面新建的package A.B.C.servlet (这里会生成文件夹在路径下ABC你们怎么开心怎么填)
- Name输入ShowMenuServlet(注意大小写)
- SuperClass需要在browse框中输入javax.servlet.http.HttpServlet
最后点击右下角的Finish,完成新建。
2 编辑 ShowMenuServlet.java
package com.sgm.devtraining.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowMenuServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
//因为兼容问题需要的UID
// request服务器向浏览器发出请求要信息; response服务器给浏览器回应 传信息
public void doGet(HttpServletRequest req, HttpServletResponse res )
throws ServletException , IOException{
// 设置编码为UTF-8
res.setCharacterEncoding("utf-8");
res.setHeader("Content-Type", "text/html; charset= UTF-8");
// printwriter 打印需要返回的内容
System.out.println("test");
PrintWriter out=res.getWriter();
// <table>:表格 th:表头 td:单元格 tr:表中的行
out.println("<table border='1'>");
out.println("<tr>");
out.print("<td>菜名</td>");
out.print("<td>介绍</td>");
out.print("<td>价格</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td> 香煎鹅肝 </td>");
out.println("<td>以鹅肝为主要原料的法式料理 </td>");
out.println("<td> 118 </td>");
out.println("</tr>");
out.close();
}
}
3 编辑web.xml
打开WebContent/WEB-INF/web.xml
添加一个Servlet元素,在容器启动的时候会根据ShowMenuServlet类创建一个实例名为menu的Servlet对象。
再添加一个servlet-mapping元素,该元素设置menu对象响应的url。
menu
/menu
意味着该menu对象会响应http://localhost:8080/MyRestaurant/menu
<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns 可拓展标记语言命名空间 namespace 赋予命名空间唯一的名字 -->
<!-- xlms 默认命名空间 ;xlms:xsi代号为xsi的命名空间 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MyRestaurant</display-name>
<!-- 容器启动时会根据ShowMenuServlet类创建一个实例名为menu的servlet对象 -->
<servlet>
<!-- 定义一个Servlet叫menu -->
<servlet-name>menu</servlet-name>
<!-- 该servlet的实现类 -->
<servlet-class>com.sgm.devtraining.servlet.ShowMenuServlet</servlet-class>
</servlet>
<!--匹配客户端请求 这里的name和上面的name一定要一样 -->
<!-- 三种匹配方式 完全/路径/拓展名 拓展名里面没*单独星号 路径可以有/* -->
<servlet-mapping>
<servlet-name>menu</servlet-name>
<url-pattern>/menu</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
怎么启动tomcat可以看这个
https://jingyan.baidu.com/article/48a420571d3770a924250426.html
4 实现登录功能
在servet容器里面增加filter
在webcontent下创建 login.html
implement和extend的区别
extends 继承类;implements 实现接口。
类和接口是不同的:类里是有程序实现的;而接口无程序实现,只可以预定义方法。
继承只能继承一个类,但implements可以实现多个接口