java学习系列之javaweb基础

servlet

先看一下一个javaweb项目的目录结构

https://img-blog.csdnimg.cn/678c4566fed9484f992e5a9f7c7cbdb8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6X5LiA5LiN5pivMDE=,size_18,color_FFFFFF,t_70,g_se,x_16

这个main 下面的java就是我们写java文件的地方

可以看到我这里创建了一个包 com.example.first

里面有两个java文件 这些文件是不能直接在浏览器上面访问的 需要我们映射到对应的浏览器的路由

因为我们没有权限在浏览器上面直接访问这些java文件

映射也就是 servlet

Servlet3.0 之前的版本都需要在web.xml 中配置servlet标签servlet标签是由servletservlet-mapping标签组成的,两者之间通过在servletservlet-mapping标签中同样的servlet-name名称来实现关联的。

映射关系我们可以在 webapp下面的 web.xml写 假如我要映射这个myservlet.java这个文件让我们能在浏览器访问他 那么我们应该在web.xml这样写

https://img-blog.csdnimg.cn/532bdd99f1f049b4b6177bd709017033.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6X5LiA5LiN5pivMDE=,size_20,color_FFFFFF,t_70,g_se,x_16

这样我们启动服务后 访问 /myservlet 就能访问这个java文件

映射我们还有另外一种写法,也就是基于注释的写法

直接写在java文件即可

https://img-blog.csdnimg.cn/1b5e4ec6936e4bacb846008c6d963d1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6X5LiA5LiN5pivMDE=,size_20,color_FFFFFF,t_70,g_se,x_16

servlet生命周期

servlet层次结构

Servlet —>GenericServlet —> Httpservlet

我们以后写java类不再需要使用Servlet接口,我们直接继承Httpservlet 即可

如下图

https://img-blog.csdnimg.cn/f4a651c51a25433b983ff87bdee417ee.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6X5LiA5LiN5pivMDE=,size_20,color_FFFFFF,t_70,g_se,x_16

访问对应路由即可

https://img-blog.csdnimg.cn/1fdc3264d0874982af80808b97e310b0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6X5LiA5LiN5pivMDE=,size_20,color_FFFFFF,t_70,g_se,x_16

JSP

jsp本质上就是一个servlet,jsp主要用于与用户交互,将最终到页面呈现给用户, HTML+CSS+JS+JAVA的混合文件

当服务器接收到一个后缀是jsp的请求时,将该请求交给jsp引擎去处理,每一个jsp文件第一次被访问的时候。JSP引擎会将它翻译成一个Servlet文件 ,再由web容器调用Servlet完成响应。

下面介绍jsp的三种写法

1、JSP脚本,执行JAVA逻辑代码

1
<%Java代码%>

2、JSP声明,定义JAVA方法

1
2
3
<%!
声明JAVA方法
%>

3、JSP表达式,把JAVA对象直接输出到HTML页面当中

1
<%=JAVA变量%>

示例代码

1
2
3
4
5
6
7
8
9
<%!
public String test(){
return "hello world";}
%>
<%
String str=test();
%>

<%=str%>

Filter

功能:

1、⽤来拦截传⼊的请求和传出的响应。

2、修改或以某种⽅式处理正在客户端和服务端之间交换的数据流。

如何使⽤?

与使⽤ Servlet 类似,Filter 是 Java WEB 提供的⼀个接⼝,开发者只需要⾃定义⼀个类并且实现该接⼝

即可。

1
2
3
4
5
6
7
8
9
10
package com.southwind.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterFilter implements Filter {
@Overridepublic
void doFilter(ServletRequest servletRequest, ServletResponseservletResponse, FilterChain filterChain) throws IOException, ServletException
{servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}

web.xml 中配置 Filter

1
2
3
4
5
6
7
8
9
<filter>
<filter-name>charcater</filter-name>
<filter-class>com.southwind.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>charcater</filter-name>
<url-pattern>/login</url-pattern>
<url-pattern>/test</url-pattern>
</filter-mapping>

注意:doFilter ⽅法中处理完业务逻辑之后,必须添加

fifilterChain.doFilter(servletRequest,servletResponse);否则请求/响应⽆法向后传递,⼀直停留在过滤器中。

JDBC

Java DataBase Connectivity 是⼀个独⽴于特定数据库的管理系统,通⽤的 SQL 数据库存取和操作的公

共接⼝。

定义了⼀组标准,为访问不同数据库提供了统⼀的途径。

JDBC 体系结构

JDBC 接⼝包括两个层⾯:

  • ⾯向应⽤的 API,供程序员调⽤
  • ⾯向数据库的 API,供⼚商开发数据库的驱动程序

https://img-blog.csdnimg.cn/418982efea404bfca2d566b2728ec5ef.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6X5LiA5LiN5pivMDE=,size_20,color_FFFFFF,t_70,g_se,x_16

JDBC API

提供者:Java 官⽅

内容:供开发者调⽤的接⼝

java.sql 和 javax.sql

  • DriverManager 类
  • Connection 接⼝
  • Statement 接⼝
  • ResultSet 接⼝

DriverManager

提供者:Java 官⽅

作⽤:管理不同的 JDBC 驱动

JDBC 驱动

提供者:数据库⼚商

作⽤:负责连接不同的数据库

JDBC 的使⽤

1、加载数据库驱动,Java 程序和数据库之间的桥梁。

2、获取 Connection,Java 程序与数据库的⼀次连接。3、创建 Statement 对象,由 Connection 产⽣,执⾏ SQL 语句。

4、如果需要接收返回值,创建 ResultSet 对象,保存 Statement 执⾏之后所查询到的结果。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.southwind.test;

import java.sql.*;

import java.util.Date;

public class Test {

public static void main(String[] args) {

try {

//加载驱动

Class.forName("com.mysql.cj.jdbc.Driver");

//获取连接

String url = "jdbc:mysql://localhost:3306/test?

useUnicode=true&characterEncoding=UTF-8";

String user = "root";

String password = "root";

Connection connection =

DriverManager.getConnection(url,user,password);

// String sql = "insert into student(name,score,birthday) values('李

',78,'2019-01-01')";

// String sql = "update student set name = '李四'";

// String sql = "delete from student";

// Statement statement = connection.createStatement();

// int result = statement.executeUpdate(sql);

String sql = "select * from student";

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery(sql);

while (resultSet.next()){

Integer id = resultSet.getInt("id");

String name = resultSet.getString(2);

Double score = resultSet.getDouble(3);

Date date = resultSet.getDate(4);

System.out.println(id+"-"+name+"-"+score+"-"+date);

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e){

e.printStackTrace();

}

}
}

PreparedStatement

Statement 的⼦类,提供了 SQL 占位符的功能

使⽤ Statement 进⾏开发有两个问题:

1、需要频繁拼接 String 字符串,出错率较⾼。

2、存在 SQL 注⼊的⻛险。

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
35
36
37
38
39
40
41
42
43
44
45
String url = "jdbc:mysql://localhost:3306/test?

useUnicode=true&characterEncoding=UTF-8";

String user = "root";

String password = "root";

Connection connection = DriverManager.getConnection(url,user,password);

String username = "lisi";

String mypassword = "000";

String sql = "select * from t_user where username = ? and password = ?";

System.out.println(sql);

PreparedStatement preparedStatement = connection.prepareStatement(sql);

preparedStatement.setString(1,username);

preparedStatement.setString(2,mypassword);

ResultSet resultSet = preparedStatement.executeQuery();

if(resultSet.next()){

System.out.println("登录成功");

}else{

System.out.println("登录失败");

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e){

e.printStackTrace();

}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2023 Wh1tecell
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~