【JavaWeb】服务器渲染
页面渲染,所谓渲染就是将数据和页面相结合,根据用户传送的数据不同,页面渲染后的内容也不同。页面渲染可以在服务器端完成,也可以在客户端完成。服务器渲染是将用户传来的数据在服务器端拼接成HTML后传给客户端,而客户端渲染是在客户端将服务器传来的数据拼接成HTML。
服务器渲染
这篇博客主要介绍一下服务器渲染。
我们可以用字符串拼接的方式,将数据拼接成HTML页面。下面我们用字符串拼接的方式完成一个猜数字web版的小游戏。
首先约定好交互方式。
GET /guess
通过get请求,从服务器得到一个页面响应,同时在服务器生成一个1-100的随机数。
POST /guess
通过post请求,将用户输入的数提交到服务器,在服务器比较用户输入的数和随机数的大小,将比较结果和次数返回。
约定好交互方式后,我们创建一个GuessNumServlet类,关联到/guess路径,用doGet方法实现第一个交互接口,doPost方法实现第二个交互接口。代码如下所示:
12345678910111213141516171819202122232425262728293031323334353637 ...
【JavaWeb】Servlet上传文件
Servlet支持上传文件操作,在HttpServletRequest类中,通过Part对象的getPart方法便可以获取请求中指定name的文件。
上传文件分为两个部分,前端部分和后端部分,关于文件操作,这两个部分都很简单,代码量很少。
各文件路径如下:
前端页面:创建一个html文件,通过form表单的action属性,与后端Servlet相关联,method属性指定方法,上传文件通常为post,通过enctype属性指定编码方式,上传文件为multipart/form-data。
1234<form action="file" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <input type="submit" value="提交"></form>
后端部分:创建一个上传文件的类U ...
时间复杂度和空间复杂度
如何衡量一个算法的好坏?我们可以从时间和空间两个方面入手,也就是时间复杂度和空间复杂度。
无论是时间复杂度还是空间复杂度,都采用大O的渐进表示法。只保留最高阶项,且最高阶项的系数为1.例如一个算法的执行次数是2N^2+M+3,那么该算法的时间复杂度是O(N^2)。
时间复杂度
时间复杂度的衡量标准也就是算法的执行次数。我们下面用几段代码来练习一下算法时间复杂度的计算。
冒泡排序的时间复杂度
123456789101112131415void bubbleSort(int[] array) { for (int end = array.length; end > 0; end--) { boolean sorted = true; for (int i = 1; i < end; i++) { if (array[i - 1] > array[i]) { Swap(array, i - 1, i); sorted = false; } } if (sorted == true) ...
【JavaSE】认识String类
创建一个Sting
String有三种构造方法,分别为直接赋值、new String方法构造和字符串数组构造。
1234567//方法1String str1="hello";//方法2String str2=new String("hello");//方法3char[] arr={'h','e','l','l','o'};String str3=new String(arr);
String是一种引用类型,内部并不存储字符串本身。
Sting的存储结构
观察下段代码,输出结果是什么?
1234567String str1="hello";String str11="hello";String str2=new String("hello");String str22=new String("hello");String str3="wor ...
【JavaSE】抽象类和接口
抽象类
什么是抽象类
被abstract修饰的类就是抽象类。抽象类是类的进一步抽象,抽象类中的方法可以不做具体的实现(抽象方法,由abstract修饰)。抽象类中也可以有普通方法。
抽象方法不能由static和final修饰,因为抽象方法要被子类重写。
抽象类中不一定要有抽象方法,但是有抽象方法的类一定是抽象类。
抽象类不能实例化,但可以引用其子类对象。
123456789101112131415161718192021222324252627282930abstract class Animal { public String name; //抽象类中也可以有构造方法,也可以有普通方法、属性 public Animal(String name) { this.name = name; } //抽象方法,不做具体实现 public abstract void eat();}class Dog extends Animal { public Dog(String name) ...
动态内存分配基本使用及常见问题
为什么需要动态内存管理?创建一个数组,我们要为数组指定大小,int arr[10];,这属于静态创建一个数组,数组arr存放在栈上。这样的创建方式有一些局限性,小了呢不够用,大了呢又浪费空间,因此要引入动态内存管理。
动态创建一个数组,不再受元素个数的限制,当元素个数与容量相等时,可以很方便地扩容。
如何动态内存管理,我们来介绍几个函数。
malloc
1void* malloc (size_t size);
参数size为要为空间开辟的字节数,开辟成功后返回值为该空间的首地址,失败则返回NULL.当size为0时,要看编译器如何处理,具体返回什么不确定。
动态开辟内存后,不需要再使用这块空间时,要使用free函数释放内存。,否则会内存泄漏。free释放后这块内存可以再次被分配,但被释放的空间的值没有被改变,它仍然指向相同(无效)的位置。
free专门用来释放动态分配的空间,如果空间为空,不执行任何操作。切记不可以用free来释放静态分配的内存空间。
12345678910111213141516#include <stdio.h>#include<stdlib.h& ...
C语言的结构体及内存对齐
结构体基础
结构体就是一些成员的集合,结构体的每一个成员可以是整型、数组、指针、结构体等不同的类型。
下面是一个简单的结构体结构,包含了类型声明struct Stu、成员、结构体变量s1的声明。
123456struct Stu { //类型 //成员 char name[20]; int age; char sex[10];}s1; //结构体变量
我们可以像上面那样声明一个结构体变量,也可以像下面这样单独声明。
1struct Stu s2;
struct是结构体关键字,Stu是结构体标志,两者构成了结构体类型。上面的语句表示为struct Stu类型的结构体声明了一个变量s1。下面是对s1的赋值操作,可以在声明结构体变量的时候直接赋值。
1struct Stu s1 = { "panghutx",20,"male" };
在声明结构体时,我们可以对结构体不完全声明。
12345678910struct{ int a; char b; double c; } a; ...
博客一周年啦
今天是3月29日,博客第一篇博文是在去年3月29日,不知不觉博客已经一年了。
一年前的今天,是大一下返校的前一天,今天,是大二下开学的第五周,一年后的今天,是大三下,不知道是在准备考研还是忙着就业。
一年后的事,一年后再说,活在当下,珍惜现在。突如其来的疫情已经持续三年了,都忘了没有疫情的生活是啥样了,三年多少人因为疫情失去了生命。上周让人悲痛的客机坠毁事件,航班人员全部遇难,向遇难者默哀。真是不知道明天和意外哪个会先来,生命无常,活着就好。
今天早上腾讯云连发了多条消息,原来是学生机和域名都快过期了。学生机是1核2G,每年108,我也不打算续费了。昨天看了橙梓的服务器迁移计划,我又心动了,今天买了五年2核2G4M的服务器,330元,我用处不大,只是觉得挺便宜的,下次续费就是2027年了,这下不用担心到期了。
下午忙活半天把hexo部署到了服务器,这下速度应该快了些,博客至少还能再活五年。五年后,我要发篇博客:博客五周年啦!
五年后的事,五年后再说吧。
常用的字符串处理函数
字符串处理类
strlen
简单介绍
size_t strlen ( const char * str );
Geting string length.
参数:str,返回值:字符串长度
字符串以\0作为结束标志,返回\0之前的字符个数。返回值是size_t(无符号)。
模拟实现
123456789101112131415161718192021222324//方法1:计时器int My_strlen1(char* ps) { int count = 0; while (*ps) { count++; ps++; } return count;}//方法2:指针相减int My_strlen2(char* ps) { char* start = ps; while (*ps) { ps++; } return ps - start;}//方法3:递归int My_strlen3(char* ps) { if (*ps == '\0') return 0; else r ...
c语言操作符练习总结
sizeof()的坑🕳
123456789101112131415#include <stdio.h>int i;int main(){ i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
观察上端代码,思考一下输出结果是什么?
首先定义了一个全局变量,全局变量没有赋值,默认值为0;然后i–;i变成了-1.你也许会说sizeof(-1),-1是int类型的,占4个字节,-1<4,结果不就是<吗!其实不然,结果是>,-1大于4?数学是体育老师教的!
原因在于sizeof()的返回值是无符号整型,也就是unsigned int,两数比较时,编译器会将左侧的值也转换成无符号整数,-1在内存中存储的是全1,即111111111111111111111111111111 ...