javaEE教程

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相比更加安全。
  1. 数据共享:Session可以给一组请求共享,解决了跨请求之间传递数据的问题。

  2. 时效性: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”
然后会得到一个这样的目录
在这里插入图片描述

  1. 创建一个名为com.sgm.devtraining.servlet的包。
    在Eclipse左侧的Project Explorer中选中MyRestaurant工程,右键new->Class,会跳出如下的弹框。
  2. 在Package中选择前面新建的package A.B.C.servlet (这里会生成文件夹在路径下ABC你们怎么开心怎么填)
  3. Name输入ShowMenuServlet(注意大小写)
  4. 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可以实现多个接口

  • 8
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值