Javaweb
Java是一门面向对象的计算机语言。就像C语言一样,java的教程书籍往往也有一个长长的目录。
我们先来看看一些java的基础概念。Java的基础概念有很多。比如类、对象、方法、线程、数组、集合、表达式、变量名、变量的声明、变量的初始化等等。概念很多。
Java和c语言是有一些类似的概念的。其实c语言是比较早的。大概是这样的因为B语言所以有了C语言,因为有了c语言所以有了c++语言,因为有了c++语言所以有了java语言。
所以java和c语言有一些类似的概念就不足为怪了。
那么什么是表达式呢? 以;结尾的一段代码,即为一个表达式。有了变量的声明,有了变量的赋值,以及表达式,还有语句,属性,以及方法。就拥有了java语言的血与肉了。然后有了类和对象这些骨架的东西。整个的java语言就已经成型了。
为了解决代码重用的问题,设置了类与类之间可以继承的规则。虽然java语言的概念众多。但是还是以类和对象为基本概念的。
在java语言中。类可以是我们自己写的,当然也可以是别人写的。别人可以是和我们一样的开发者,也可能是java语言的发明者。当然也有中间件公司的开发者。
不管是谁写的类,一个java类经过编译后都可以变成一个class文件。Java语言的发明者以及中间件公司的开发者写的类,一般是直接给别人用的。他们也许不希望别人修改他们写的代码,所以他们一般提供给别人class文件。当然这已经足够了。如果想看源码。那也是比较容易就能做到的事情。
比如一点源码分析
注意写注释的格式
*@paramonlyIfAbsent if true, don't change existing value 相同key是不是覆盖值
*@paramevict if false, the table is in creation mode. 在hashmap中没用
*@return previous value, or null if none
注意一下方法参数的格式:
finalV putVal(inthash, K key, V value,booleanonlyIfAbsent,
boolean evict) {
这个方法用final来修饰,首先说明如果继承这个类,这个方法也是不能被修改了,大概是这个方法比较难写,作者怕用户写乱了坏事吧。。毕竟难搞的事情搞定了,就要好好地把结果给保存好比较好。否则再给莎士比亚画画眉毛不就坏事了?
然后这个方法前面是默认修饰符。说明这个方法就是供它自己系统本身用的。不是直接给用户使用的。
注意一下局部变量的命名习惯:
Node[] tab; Node p;intn, i;
if((tab = table) ==null|| (n = tab.length) == 0)
n= (tab =resize()).length;
if((p = tab[i = (n - 1) & hash]) ==null)
tab[i]= newNode(hash, key, value,null);
类的编码格式 sun公司提供的例子如下
* @(#)Blah.java 1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303,U.S.A.
* All Rights Reserved.
*
* This software is the confidential and proprietaryinformation of Sun
* Microsystems, Inc. ("ConfidentialInformation"). You shall not
* disclose such Confidential Information and shall useit only in
* accordance with the terms of the license agreementyou entered into
* with Sun.
*/
package java.blah;
import java.blah.blahdy.BlahBlah;
/**
*
Class description goes here
.
*
* @version
1.82 18 Mar 1999
* @author
Firstname Lastname
*/
public class Blah extends SomeClass {
/* A class implementation comment can go here. */
/**
classVar1 documentation comment
*/
public static int classVar1;
/**
*
classVar2 documentation comment that happens to be
*
more than one line long
*/
private static Object classVar2;
/**
instanceVar1 documentation comment
*/
public Object instanceVar1;
/**
instanceVar2 documentation comment
*/
protected int instanceVar2;
/**
instanceVar3 documentation comment
*/
private Object[] instanceVar3;
/**
* ...
constructor Blah documentation comment...
*/
public Blah() {
// ...implementation goes here...
}
/**
* ...
method doSomething documentation comment...
*/
public void doSomething() {
// ...implementation goes here...
}
/**
* ...method doSomethingElse
documentation comment...
* @param someParam
description
*/
public void doSomethingElse(Object someParam) {
// ...implementation goes here...
}
}
详情参考:https://www.jianshu.com/p/2845c458dda9
这个例子比较简单,但是大部分sun公司的源码还是很复杂的。
还好如果只是做个javaweb开发。在工作之时或许只需要查看一下相关的源码也是可以的。一般来说,查看源码很多也是锦上添花吧。
说到javaweb,除了说java还要说web。要不然怎么叫javaweb呢?那么说到web就不能不说http通信了。
http通信是一种简单的数据传输模式。一般来说分为客户端请求,服务器响应两个步骤。完成了这两个步骤。一次通信就完成了。一次通信一次连接。下一次再通信就需要重新建立连接了。
而http的通信格式则包括了头和体。头装的是一些键值对。包括了cookie,token这些。
而体则包括了一些请求参数或者返回数据等。
可以说javaweb最终就是要建立一个http服务集合。
能建立http服务集合的计算机语言很多。为什么要选择java呢?这要从很久以前说起。在很久以前。http服务集合,一般提供的是静态html页面这种http服务集合。这时候一般不用java。后来这种简单的http服务集合,已经被另一种http服务集合替代了。另一种http服务之所以能替代前者,是因为它能够动态地返回html页面。这样子用户也可以参与页面的生成了。而java很擅长动态地返回html页面。因为java这种语言的本身,就很适合来封装一大堆有规律的数据。而html页面上的数据一般都是很有规律的。这样子开发起来从思路上来说就会简单很多。另一方面是java语言本身的健壮性增加了http服务的安全性能,平台无关性减少了开发量。所以java在动态web开发领域起到了相当大的作用。
而各个数据库基本都实现了与java进行通信的接口,所以使用java做http开发可以选择多种数据库。除了这些,sun公司自己都开发出了http服务的标准类,servlet。从而开发者只需要继承这个类,重写doGet或者是doPost方法,就可以简单地建立自己可靠的http服务了。这已经完了吗?不,还远远没有。后来因为java做http服务这一块儿太火了。而其实这里面有很多重复啰嗦艰涩的事情还没有解决。于是有的公司就嗅到了商机专门做起了第三方中间件。当然也包括众人拾柴火焰高的开源中间件,也有个别的大牛在做开发时嫌麻烦于是自己开发了一个中间件等等不一而足。我们先来看看这时的java做http服务有哪些重复啰嗦和艰涩的事情。首先因为一般来说一个servlet对一个http服务,而要做的是一个http服务集合。加入这个http服务集合包含了一千多个服务呢?想一想虚拟机里面至少有1000个servlet对象在时刻候命着,也不能休息。这得多占内存呢?而且占内存也就算了,在开发的时候那可叫一个麻烦啊。难道这些看起来都大同小异的代码就不能想个办法少写点吗?其次在上个例子中虽然虚拟机有1000个servlet对象了。但是每个servlet各自负责的是自己的一个http服务。那么这时候有3个用户同时进行一个http服务,那么这个servlet对象就要同时做三件事了。也就是说有三个线程同时调用了这个servlet。这时候其中一个线程本来想把一个临时变量存在这个servlet对象中。结果被下一个线程给覆盖了,于是错误发生了。也就是说发生了线程不安全的情况。
对于代码重复啰嗦的情况,可以对servlet这个类进行修改,从而使它可以处理多个http服务,实际上是让它负责项目中所有的http服务。不过这时候它不可能完整地负责每个http服务的开始到完成了。实时上它这个时候只是负责了一下转发。把大部分任务都交给了别的模块来做,而它自己则只负责一小部分。正因为修改后的servlet负责的工作少,所以即使它也是线程不安全的多以它也能做到对线程安全没有任何影响。
另一件重复啰嗦艰涩的事情就是和数据库通信的事情。说到和数据库通信,其实数据库作为一个应用,它自己也占据着一个端口,一般来说是3360。就像是tomcat占据着一个端口,一般来说是8080一样。一个应用,包含了一个或者几个进程。因为占据着一个端口所以数据库本来可以直接和外部通信的。这也说明了数据库甚至也是可以作为一个远程的数据库来使用的。因为属于不同的进程,所以tomcat在和数据库进行通信的时候,还是非常的麻烦的。它们通信的桥梁:“连接”就是一种宝贵的资源。那么一开始人们使用这种资源,会在使用完毕完毕之后关闭资源,从而避免资源浪费。但是其实频繁地开启资源与关闭资源本身也挺浪费“资源”的。所以人们开始使用连接池。连接池,也没什么,不过连接池不太好写。里面的内容挺多的。所以就有人把连接池封装了,然后把数据库的操作也封装了。
那么为什么要封装呢?原因很简单就是封装之后就好用了。而且代码也更容易写得规范了。
而且还不止这些,有的人还提出了一些新的概念,比如一级缓存二级缓存。这里的一级缓存二级缓存,是这里特定的概念。和cpu那边的一级缓存二级缓存不是一样的。但是作用却是和cpu那边的一级缓存二级缓存差不多。大概是因为缓存的作用都比较类似吧。
除了性能问题,在数据库的处理上,sql语言也是一个需要注意的问题。
一般来说sql语言,其实能够体现数据的复杂性。因为必要的sql语句的复杂,其实直接来源就是数据的复杂。
为什么说数据经常是复杂的呢?因为数据一般都是对现实世界的抽象,而现实世界是复杂的,所以数据也变的复杂了。
最常用的一个例子,是学生选课的情景。在这个情景里首先有一个学生信息表,这是对学生的抽象。其次有课程表,这是对课程的抽象。最后还有一个成绩表。这是老师制作的一张表。
一般现实中,都会有这几张表。显然学生,课程,成绩之间有着一定的关系。
Sql语言即使千变万化,但是开头都是比较固定的。一般就是四种,正所谓“增删改查”。
增删改其实也没什么好说的,小心一点基本问题不大。但是这个查的确值得说道说道了。为什么呢,因为查可以为删和改服务的。所以复杂的删和改语句,其实就是复杂的查询语句。或者说复杂的sql语句一把都包含了复杂的查询语句。
如果只是在一张表里查询。一般分为几种,其中一种是分组查询,一种是简单查询。
分组查询,就是按照特征查询。这样的查询是以组为单位的。而简单查询是以表中的基本数据单元——即一条记录为单位的。分组查询的关键字是group by。比如select count(*) from student group by age;这样的一条语句执行下来,得到的结果就是每个年龄的学生人数。当然如果觉得这样查的数据有点让人摸不着头脑,那么也可以这样子查:select age,count(*) from student group by age;这样子查询出来的数据看起来意思就清楚多了。如果觉得还不够还可以这样:select age 年龄,count(*) 人数 from student group by age; 这样子查询出来的数据看起来意思就更加清楚了。简单查询这里不再举例。另外还有一种查询,名字叫做子查询,其实就是根据查询出来的结果再次查询,所以叫“子查询”。比如查询大于平均年龄的学生:select * from student where age>(select avg(age) from student);之所以这里要用子查询,因为查询的条件不是现成的,而是需要从表中先查出来才可以的。也就是说先要查出条件,然后再根据条件再进行查询。
如果是两张表,那么则有更多的查询方法。但是为什么要同时查两张表呢?因为可能是受客观现实和实际情况的限制,一张表的内容的信息有时候是达不到自己的查询要求的,只有两张表的内容合起来查,才有可能达到自己的查询要求。比如在上面的例子中我要查询某课程中某地区学生的平均分数。这就需要对学生表与成绩两张表同时查询了。在两张表查询的时候,会先把两张表“整”成一张表。如何做到这一步呢?其实这一步的目的就是把成绩表中的学生号一栏修改一下。那就是让它变成学生所在的地区。或者是让它变成包含的学生所有信息的几个栏。而这是需要算法的。算法就是一开始让这一栏,对应所有的学生。
(即如 select * from
score join student;即把学生表加入到成绩表中。这样子两张表就被“整”成一张表了。只不过成绩表的每一栏都对应所有的学生,显然是不对的。所以还要处理,就是成绩表的每一栏只能对应一个学生。即select * from student join score where score. Studentid= student.id这样就正确“整”成一张表了。然后从这张表中查询即可,即:select avg(socre) from student join score where score. Studentid= student.id
and student .home=”***”;或select avg(socre) from student b join score a where a. Studentid= b.idand b.home=”***”;
一般对于join这个词来说,主语应该是副表。但是也不一定。因为左主右幅。当他从左边join,那么它就是主表了。)
很多服务器都是linux系统。Linux系统是开源的。也许因为服务器需要注册,所以不能使用盗版windows,所以更多地使用Linux吧。当然linux本身的特性也很好。网络方面linux更加专业吧。
Linux和windows相比。Linux的命令行是相当的强大。Windows当然也有命令行。但是就像windows本身的含义那样。“窗口”,说明windows系统是以窗口视图为主。正是因为窗口视图为主,所以鉴于系统的容量有限,命令行的功能就要被去掉很多了。
那么远程操作linux的方法有很多。主要可以通过文件传输软件向linux系统传输文件。使用linux命令行操作linux。linux运维的事情一般就是确保linux系统和项目正常。其实也就是确保服务器的正常。一般有专门的工具可以诊断linux系统是否正常。当然一般通过命令行即可达到这样的目的。无论是命令行还是专门的工具,都是要检查系统的几个参数来确保系统是否正常的。这几个参数主要有:总的内存使用率,总的cpu使用率,以及主要的特别是项目相关的几个线程的内存使用率和cpu使用率等。
一般来说一个优秀的项目。需要以下几点。完备的安全认证机制,一流的缓存策略,良好的扩展能力,完整的监控工作,完备的预警机制,完善的应急机制。可高质量容纳高数量用户。以及出现了问题能够便于快速定位找到问题。以及当需要修改程序的时候便于修改。还有当需要扩展服务器的时候易于扩展服务器。以及必要的项目说明。
一般开发文档可以按照以下模式填写:
项目名称:简单博客
项目http服务简单介绍:这个也不用一个个介绍,概括到位即可。
发送验证码 参数:手机号
登录 参数:手机号 验证码
查看别人的文章列表 参数:无
查看别人的文章 参数:文章id
查看自己的文章 参数:文章id
发表文章 参数:文章题目 文章正文
修改文章 参数:文章id
对文章进行打分 参数:文章id 参数
查看自己的文章列表 参数:无
删除文章 参数:文章id
因为名字叫做简单博客,所以功能做的也很简单,总共也就10个http访问。
特点分析:主要使用自增主键id进行文章识别
项目的数据库结构:这个有辅助软件,使用E-R图即可。填写参考什么什么E-R图即可。
因为是java编程 所以不妨先想一想需要哪些承载数据的pojo类吧。
文章类 字段是 id 文章名 文章正文 用户id
用户类 字段是 id 用户名 密码
也许需要做哪些http服务 基本上已经决定了数据库的基本包含哪些数据了
项目的用户认证方式:
项目使用的中间件:比如springboot
shiro springcloud tomcat等
项目的开发周期:
项目的开发大致计划以及预备计划:
项目的开发工具:
项目的备份策略:
项目的迭代策略:
项目的前端框架:
网友评论