JSP复习


一、解释类:


相关端口号:

http端口80

https端口443

MySQL端口默认3306

Tomcat端口默认8080

名词解释:

UTF-8:是一种可变长字符编码,其占位为1-4byte,前部分字符与ASCII码对应。

GBK:GBK是中国标准,占2byte,只在中国使用,并没有表示大多数其它国家的编码;而各国又陆续推出各自的编码标准,互不兼容,非常不利于全球化发展。

JSP内置对象:在JSP页面中可以直接使用的对象。

Tomcat目录解释:


Tomcat目录一共有7个:

bin目录:主要用于存放tomcat的命令,主要有两大类,一种是linux使用的shell指令,一种是以bat结尾的windows指令。

conf目录:主要是存一些tomcat的一些配置文件,可以配置其tomcat访问的端口号域名,以及日志输出等。

lib目录:主要是用在存放tomcat运行我们项目的时候所需要依赖的jar包,比如我们使用OKHTTP请求依赖库时,可以将其加入到lib目录下。

logs目录:这个是用来存放tomcat运行时所产生的日志文件。

temp目录:这个主要是用于存放tomcat在运行时候所产生的临时文件。

webapps目录:这个目录主要用于存放我们基于Servlet写好的Java项目程序,可以以文件夹、war包、jar包的形式发布。

work目录:这个目录主要是用于存放tomcat在运行时的编译后的文件,例如jsp编译后的文件。

注释注解的区别:

注释:这个在编写程序的时候主要是给程序员看的,相当于作为相应代码的说明等,不是参与代码的编译与运行。

注解:注解的作用在Java中不仅仅可以给程序员看,他还可以参与代码的编译与运行,通过注解我们可以实现很多有趣的功能,比如我们可以通过注解加反射来进行相关功能的编写,其Spring框架中单例模式的实现其实就是通过反射扫描注解对应的类和属性来实现的Bean注入的。

列举说明Path环境变量的作用?

path环境变量定义了操作系统在哪些目录中搜索可执行程序。它简化了在命令行终端执行命令时不必提供完整路径,例如将java的bin目录添加到path之后,可以在任意目录下去调用执行java编译器或运行器。

举例说明CLASSPATH环境变量作用?

CLASSPATH的作用主要是用来指定Java程序所依赖的类库的位置,在JDK1.5之前的版本中,需要通过配置环境变量CLASSPATH来指定Java程序所依赖的类库的位置,否则程序无法找到相关的类库。而在后续版本中默认指定为当前目录,所以其实没有特殊的需求不配置CLASSPATH也是可以的。

java指令解释:

javac:java编译器,Java程序的编译工具,用来将Java程序的源文件编程成字节码文件,也就是class文件。

java:Java解释器,解释和执行已经转换成字节码的Java程序。

javap:java反汇编器,显示编译类文件中的方法和变量,还可可以显示字节代码的含义。

jar:jar文件管理器,可以将类文件打包成一个文件。

网页中如何实现不同页面之前的数据共享?

网页中实现不同网页的数据的共享是SESSION。

如何通过反射获取当前类中所有的成员方法

首先我可以通过Class类中的forName静态方法来启用反射获取对应我们需要获取的类。然后通过传过来的Class对象中的getDeclaredMethods方法来获取对应类中的所有方法,getDeclaredMethods方法调用其返回的是一个Method对象数组,其Method数组就是其对应类的所有成员方法。

maven的配置文件名称是什么?

Maven的配置文件名称为pom.xml

Javaweb的配置文件名称是什么?

Javaweb的配置文件名称为web.xml

log4j的配置文件名是什么?

log4j的配置文件名称为log4j.properties

简述maven中本地/中央/远程仓库之前的关系

在maven中,本地仓库是存储已下载或自行导入的依赖,远程仓库提供了项目构建所需的依赖下载,中央仓库是默认的远程仓库,存储了众多开源项目的构建,这三者协同工作,一般默认情况我们用maven导入依赖时会先去本地仓库去寻找是否有相关的依赖,如果没有才会去中央仓库或者自己设置的仓库镜像去寻找下载到本地。

request是什么?

request对象在servlet里面主要起到的是接收前端所发送给服务端的请求,我们程序员在编写servlet程序的时候可以通过doGet或者doPost中的request对象来接收前端所传过来的http请求信息,并且加以处理。

response是什么?

response在Servlet中,主要可以起到针对request请求返回给对应请求用户信息的作用,也就是说当我们使用request接收请求后可以根据request中的信息内容做一系列业务逻辑处理后通过response返回最终结果信息给请求用户前端。

解释为什么eclipse中web.xml中会有自动提示(关键要讲到schemaLocation这玩意)

eclipse有自动提示web.xml内容主要是因为在头部中schemaLocation属性有对应xsd或者dtd文档指定,其对应的指定文档有对xml书写的约束,而eclipse可以通过读取这些文档进行针对性进行约束提示。所以其实不管是Servlet的xml配置文档还是我们自定义xml其实都可以实现自动提示,前提是你规范化了xsd文档或者dtd文档。

反射,注解在开发中的作用。

通过反射我们可以在Java程序运行中动态的将class字节码文件加载到jvm虚拟机当中调用对象的方法和操作对象的属性,通过使用反射,我们可以在编译期间未知具体类型的情况下,对类进行操作,这也体现了java程序的动态拓展性质,比如部分Java所编写的游戏就可以利用这一特性动态的加载游戏mod,例如《Minecraft》。

注解,可以附加在package,class,method,filed等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问,并且通过注解我们可以实现更多有趣的功能,比如Jackson的json序列化和反序列化就可以通过注解来实现一些特殊功能。

当我们修改jsp文件,tomcat的运行过程。

首先,tomcat会将jsp文件转换成Java文件然后再编译成class文件加加载到jvm虚拟机中,如果修改jsp,再次访问jsp文件之后会重新编译,重新加载class文件。

log4j的作用?

log4j是一个功能强大的日志组件,提供方便的日志记录,同时也支持日志持久化输出存储。

二、填空题:


相关快捷键

块选择菜单:alt+shift+A

surround with: alt+shift+z

代码生成菜单:alt+shift+s

行注释快捷键:ctrl+/

块注释:ctrl+shift+/

取消注释代码:ctrl+alt+/

查看结构:ctrl+t

专业术语翻译

syntax 语法

Exception 异常

database 数据库

SQL 结构化查询语言

manual 手册

corresponds to 与什么什么通信

Null Pointer 空指针

Communication 通讯

constraint 约束

violation 违反

Duplicate 重复

primary key 主键

driver 驱动

packet 数据包

millisecond 毫秒

access 访问

deny 拒绝

statement 陈述

query 查询

suitable 合适

issue 问题

failed 失败

reflect 反射

annotation 注解

error 错误

warn 警告

三、代码题:


如何用反射的方法去实例化对象?

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("Hello");
Hello o = (Hello)clazz.getDeclaredConstructor().newInstance();
System.out.println(o.name);
}
}



class Hello{
public String name = "张三";
}

默写名为xxx的类,要求这个类可以通过某个网页地址访问。

1
2
3
4
5
6
7
8
9
10
11
@WebServlet("hello")
public class XXX extends HttpServlet{

public void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception{
response.setContentType("text/html");

//Hello
PrintWriter out = response.getWriter();
out.println("<html><body>"+"<h1>"+"Ciallo~(∠・ω< )⌒★"+"</h1>"+"</body></html>");
}
}

默一个servlet的实现。

1
2
3
4
5
6
7
8
9
@WebServlet("hello")
public class XXX extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception{

}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws Exception{

}
}

默一个java的单例实现代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Main {

public static void main(String[] args) throws Exception {
Hello instance = Hello.getInstance();
}

}
class Hello{
private static volatile Hello hello;

public Hello(){}
public static Hello getInstance(){
if(hello==null){
synchronized (Hello.class){
if(hello == null){
hello = new Hello();
}
}
}
return hello;
}
}

用反射实例化某个类,并枚举所有函数,并调用kk无参无返回值的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Main {
public static void main(String[] args) throws Exception {
Class clazz= Class.forName("Hello");
for (Method method : clazz.getMethods()) {
if (method.getName().equals("kk")) {
method.invoke(clazz.getDeclaredConstructor().newInstance());
}
}
}
}



class Hello{
public void kk(){
System.out.println("Ciallo~(∠・ω< )⌒★");
}
}

用反射实例化某个类,并枚举他的所有属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TestMain {
public static void main(String[] args) throws Exception {
Class clazz= Class.forName("Hello");
Field[] fields = clazz.getDeclaredFields();

for(Field field : fields){
Object o = clazz.getDeclaredConstructor().newInstance();
field.setAccessible(true);
System.out.println("属性名:"+field.getName()+"变量内容:"+field.get(o));
field.setAccessible(false);
}
}
}



class Hello{
private Integer age = 18;
public String name = "张三";
}

请你手工实现一个注解,并在程序中打印注解默认值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Main {
@Ciallo
private String txt;

@Ciallo
public void test(){

}

public static void main(String[] args) throws Exception {
Class<?> main = Class.forName("Main");
for (Field declaredField : main.getDeclaredFields()) {
if (declaredField.isAnnotationPresent(Ciallo.class)) {
Ciallo annotation = declaredField.getAnnotation(Ciallo.class);
System.out.println(annotation.txt());
}
}
for (Method method : main.getMethods()) {
if (method.isAnnotationPresent(Ciallo.class)) {
Ciallo annotation = method.getAnnotation(Ciallo.class);
System.out.println(annotation.txt());
}
}
}



}

@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface Ciallo{
String txt() default "Ciallo~(∠・ω< )⌒☆";
}

四、看图写程序:

请你根据MySQL查询界面,请写出对应的Java程序。

增:

1
insert into `user`(uid,name,age) values ("114514","葬送的芙蓉王",12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345678");
String sql = """
insert into `user`(uid,name,age) values (?,?,?)
""";
PreparedStatement pre = con.prepareStatement(sql);
pre.setString(1,"114514");
pre.setString(2,"葬送的芙蓉王");
pre.setInt(3,12);
int i = pre.executeUpdate();
if(i>0)
System.out.println("添加成功");

}
}

删:

1
delete from `user` where `name`='葬送的芙蓉王';
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345678");
String sql = "delete FROM `user` where `name`=?";
PreparedStatement pre = con.prepareStatement(sql);
pre.setString(1,"葬送的芙蓉王");
int i = pre.executeUpdate();
if(i>0)
System.out.println("删除成功");

}
}

改:

1
update `user` set `age`=21 where `name`='亚托莉';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345678");
String sql = """
update `user` set `age`=? where `name`=?;
""";
PreparedStatement pre = con.prepareStatement(sql);
pre.setInt(1,21);
pre.setString(2,"亚托莉");
int i = pre.executeUpdate();
if(i>0)
System.out.println("修改成功");

}
}

查:

uid name age
1001 亚托莉 18
1
select * from `user` where name='张三';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345678");
PreparedStatement pre = con.prepareStatement("select * from user where name=?");
pre.setString(1,"亚托莉");

ResultSet resultSet = pre.executeQuery();

while (resultSet.next()){
System.out.printf("uid:%s,name:%s,age:%d \n",resultSet.getString(1),resultSet.getString(2),resultSet.getInt(3));
}
}
}