1.html制作学生信息查询系统
要求
用html文件制作一个简单的学生信息查询系统,仅完成学生信息的全部显示即可
运行结果
代码案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Student List</title>
</head>
<!--
学生信息: 学号(NO.),姓名(name),性别(sex),年龄(age)
-->
<body>
<table border="1">
<tr>
<th>NO.</th>
<th>name</th>
<th>sex</th>
<th>age</th>
</tr>
<tr>
<td>001</td>
<td>ZhangSan</td>
<td>M</td>
<td>19</td>
</tr>
<tr>
<td>002</td>
<td>LiSi</td>
<td>W</td>
<td>10</td>
</tr>
<tr>
<td>003</td>
<td>WanWu</td>
<td>M</td>
<td>18</td>
</tr>
</table>
</body>
</html>
2.制作简易服务器查看学生信息查询系统
思路顺序
- 制作一个假服务器
- 接收浏览器访问请求,做出响应
- 打印html文件
打印html文件的两种方式
- 逐行打印html文件
- 优势:可以直接在java代码中利用数据库等工具更改数据,更适合一般情况
- 劣势:书写内容繁琐
- 直接读取html文件打印
- 优势:书写内容少,书写效率高
- 劣势:如涉及信息的增删改,如学生信息的增加修改等,无法做到直接修改
- 总结:虽然方法二比较方便,但是方法一对于日常使用更加重要
代码示例
- 逐行打印html文件代码示例:
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[]args) throws IOException {
ServerSocket ss=new ServerSocket(10003);
Socket s= ss.accept(); //接收请求
InputStream in= s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String str=br.readLine();
String [] strs =str.split(" ");
//判断请求请求资源是否为stuList.html文件,不是则直接结束
if(!strs[1].equals("/stuList.html")) {
s.close();
return ;
}
//以下为对浏览器做出响应
OutputStream out=s.getOutputStream();
PrintWriter pw=new PrintWriter(new OutputStreamWriter(out));
pw.println("HTTP/1.1 200 OK");
pw.println("Content-Type: text/html");
pw.println(""); //响应协议固定内容,之后为我们所做的响应体内容,即stuList.html文件
pw.println("<!DOCTYPE html>");
pw.println("<html>");
pw.println("<head><title>Student List</title></head>");
pw.println("<body>");
pw.println("<table border='1'>");
pw.println("<tr> <th>NO.</th> <th>name</th><th>sex</th><th>age</th> </tr>");
pw.println("<tr><td>001</td> <td>Zhanghongyu</td> <td>m</td> <td>19</td></tr>");
pw.println("<tr><td>002</td> <td>Ruanchenxi</td> <td>m</td> <td>19</td></tr>");
pw.println("<tr><td>003</td> <td>Zhangsan</td> <td>m</td> <td>19</td></tr>");
pw.println("</table>");
pw.println("</body>");
pw.println("</html>");
pw.flush();
s.close(); //清除缓存,否则显示不完全
}
}
- 直接读取html文件 代码示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.*;
import java.net.*;
public class StuCourseApp {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10072);
Socket s = ss.accept();
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String str = br.readLine();
// 接收请求,返回响应
String[] strs = str.split(" ");
OutputStream out = s.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
FileReader fr = new FileReader("C:/Users/27154/Desktop/html/" + strs[1]);
BufferedReader bfr = new BufferedReader(fr);
pw.println("HTTP/1.1 200 OK");
pw.println("Content-Type: text/html");
pw.println("");
// 2.利用文件读取,读取html文本
while ((str = bfr.readLine()) != null) {
pw.println(str);
}
pw.close();
s.close();
// 二者对比,各有优劣,如果只涉及到数据的打印,数据不会发生变化,则2更方便,但是如果涉及到数据的变动,例如学生的更新删除等等,2无法做到直接修改,还是1好用
}
}
3.apache-tomcat-9.0.90介绍
3.1文件说明
- bin 二进制文件
- conf 配置文件
- lib 库文件
- logs 日志文件
- temp 临时文件
- webapps 项目文件
4.Servlet
4.1定义
Servlet是Server Applet的简称,是用Java编写的服务器端程序。其主要功能在于和浏览器交互并生成动态Web内容。
后续我们将不再自己写一个假服务端来接收浏览器请求,直接使用Servlet进行。
4.2作用
- 程序片段
- Servlet可用来处理浏览器请求
4.3抽象理解Servlet工作原理
4.3.1Servlet
- 使用自己写的类创建对象 例如:类名 对象名 = new 类名()
- 使用自己创建的调用方法 例如:对象名.方法()
红体字为我们后续工作时写的类,黑体为apache-tomcat已经写好的存放在那的类
4.3.2思考
既然它已经写好类和方法了,他又怎么知道我们后续创建的类和方法呢?又怎么使用我们后续新创建的类和方法呢?
4.3.3答案
通过多态和继承解决它已经存入的上述黑体字数据,通过反射机制解决我们新创建的红体字数据。
具体原理b站链接:
动态代理-01-动态代理的思想分析_哔哩哔哩_bilibili
大致思路:
它先封装好多个主类及对应主类方法,我们再创建新的类时,要严格按照主类要求来创建,通过继承其中一个主类,重写主类方法。再通过反射机制,使我们新创建的类和方法直接映射到已写好代码中去。
这样我们只需要向文件添加新的类,就可以实现2中的全部代码功能,而不需要重写新程序
下是案例代码举例:我们只需要写入新的子类与修改Object.txt中内容即可,不需要修改原有代码
import java.io.*;
//main函数中代码原本全部写好,我们不需要更改,我们只更改了Object.txt的内容与创建新的子类
public class Poly {
public static void main(String[] args) throws Exception {
// 反射机制,使得Object.txt内的内容被提取出来
// Object.txt只存储了"Cat"三个字符,反射为后面的 new Cat();
FileReader fr = new FileReader("Object.txt");
BufferedReader br = new BufferedReader(fr);
String str = br.readLine();
// 类名(他已经输入好的类,如这里的Animal) 对象名(他已输入好的,如animal) = new 类名() (我们将写的,如这里的cat)
Animal animal = (Animal) Class.forName(str).newInstance();// Animal animal = new Cat();
// 对象名.方法()
animal.say();
}
}
// 原本已经写好的主类Animal
interface Animal {
public void say();
}
// 我们新创建的子类Dog
class Dog implements Animal {
public void say() {
System.out.println("汪汪汪");
}
}
// 我们新创建的子类Cat
class Cat implements Animal {
public void say() {
System.out.println("喵喵喵");
}
}
5.通过apache-tomcat在浏览器查看html文件
5.1方法步骤
1. 写一个字类继承 HttpServlet ,重写方法,导包servlet-api.jar,如代码中的OutPut
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class OutPut extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Hello,World!");
}
}
package poly;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class StuList extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter pw = resp.getWriter();
pw.println("<!DOCTYPE html>");
pw.println("<head><title>Student List</title></head>");
pw.println("<body>");
pw.println("<table border='1'>");
pw.println("<tr><th>NO.</th><th>name</th><th>sex</th><th>age</th></tr>");
pw.println("<tr><td>001</td><td>ZhangSan</td><td>M</td><td>19</td></tr>");
pw.println("<tr> <td>002</td><td>LiSi</td><td>W</td><td>10</td></tr>");
pw.println("<tr> <td>003</td><td>WanWu</td><td>M</td><td>18</td></tr>");
pw.println("</table>");
pw.println("</body></html>");
}
}
2.将.class文件复制到classes文件夹下,注意如果该.class类在一个包中,则需要将包文件一起存放,例如下图示:poly表示一个包,包中包含两个.class文件
3.改web.xml配置,用<servlet>和<servlet-mapping>定位,命名格式尽量与类名相同
我们在网页输入网址http://127.0.0.1:8080/url(我们需要请求访问的资源)
当apache-tomcat接收到网址<url-pattern> /OutPut 时,它会根据<servlet-name> OutPut 找到对应的<servlet-name> OutPut,然后访问<servlet-class>OutPut类,如下图示例:
注意如果类在包中,需要将包的名字就需要写上 包名.类名,如下图示例:
4.运行bin文件夹下的startup.bat文件,每次调试后都需要重新打开。
5.在网页端输入查询地址,得到结果,例如下图
6 debug
6.1 apache-tomcat端口被占用
解决方法:
1.Win + R运行命令cmd启动命令提示符
2.输入netstat -ano,找到8080端口对应PID
3.打开任务管理器,在详细信息中找到对应PID,结束该任务,重新启动即可