JavaWeb基础1-1

JavaWeb基础1-1

一、Maven

常用的Maven仓库

用pom.xml文件表示:

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>New_Maven_1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
<plugins>
<plugin>
<!--Tomcat-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

<!--IO流工具类-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>

<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>

<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>

<!--JSP-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>

<!--JSTL/jsp依赖-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<!--JSTL依赖-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>

</dependencies>


</project>

二、MyBatis

优秀的持久层框架,简化JDBC的开发

JavaEE的三层:表现层、业务层、持久层

可以理解为Java程序与数据库的连接和交换方式

三、Mapper

首先注意映射关系,如图:

1、写在xml文件中的方法

BrandMapper.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.mapper.BrandMapper">
<resultMap id="brandResultMap" type="brand">
<result column="brand_name" property="brandName"></result>
<result column="company_name" property="companyName"></result>
</resultMap>
</mapper>

BrandMapper.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.study.mapper;

import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import com.study.pojo.Brand;
import java.util.List;

public interface BrandMapper {

/**
* 查询所有
* @return
*/
@Select("select * from tb_brand")
@ResultMap("brandResultMap")
List<Brand> selectAll();
}

2、全部写在注释中的方法

UserMapper.xml

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User.mapper.UserMapper">

</mapper>

UserMapper.java

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
package User.mapper;
import User.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {

/**
* 根据用户名和密码查询用户对象
* @param username
* @param password
* @return
*/
@Select("select * from tb_user where username = #{username} and password = #{password}")
User select(@Param("username") String username, @Param("password") String password);

/**
* 根据用户名查询用户对象
* @param username
* @return
*/
@Select("select * from tb_user where username = #{username}")
User selectByUsername(@Param("username") String username);

/**
* 添加用户
* @param user
*/
@Insert("insert into tb_user values(null,#{username},#{password})")
void add(User user);

}

四、Tomcat

一个网络服务框架

可以本地配置,也可以Maven导入一个插件

同时注意,Tomcat9及之前的版本默认的编码格式不是UTF-8,是ISO-8859-1,Tomcat10是UTF-8,可能会出现中文乱码的问题

GET的解决方式:

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
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = "张三";
//1.URL编码
// String encode = URLEncoder.encode(username, "utf-8");
// System.out.println(encode);
//2.URL解码
// String decode = URLDecoder.decode(username, "utf-8");
// System.out.println(decode);
//3.转化为字节数据
// byte[] bytes = decode.getBytes("ISO-8859-1");
// for(byte b : bytes) {
// System.out.println(b + " ");
// }
//4.将字节数组转化为字符串
// String s = new String(bytes, "utf-8");
// System.out.println(s);

//一行代码解决
String s = new String(username.getBytes("ISO-8859-1"),"utf-8");

}
}

POST的解决方式:

1
2
3
4
5
6
7
8
9
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//设置字符输入流的编码,这样就可以了
}
}

五、Servlet

1、Request和Response

使用Request对象来【获取请求】数据

使用Response对象来【设置相应】数据

一般格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@WebServlet("/resp2")
//Web访问的路径
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应类型
resp.setContentType("text/html;charset=utf-8");
//通过Response对象获取输出流
PrintWriter writer = resp.getWriter();
//写数据
writer.write("resp2");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

2、SqlSessionFactory

一般要抽取一个SqlSessionFactory工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//静态代码块会随着类的加载而自动执行,且只执行一次
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}

相关的调用和替代:

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
@WebServlet("/request-demo/registerServlet")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接受用户数据
String username = req.getParameter("username");
String password = req.getParameter("password");

//2.封装用户对象
User user = new User();
user.setUsername(username);
user.setPassword(password);

//3.调用mapper,根据用户名查询用户对象
// String resource = "mybatis-config.xml";
// InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 上面为旧方法,下面用调用静态方法解决:
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User u = userMapper.selectByUsername(username);

//4.判断对象是否存在
if (u == null) {
//用户名不存在,添加用户
userMapper.add(user);
sqlSession.commit();
sqlSession.close();
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("注册成功");
} else {
//用户已存在,提示
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("用户已存在");
}

}
}

六、JSP

先导入最先的需要的Maven库和其依赖

1、Java Server Pages/Java服务端页面

一种动态的网页技术,可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
System.out.println("hello");
//在这里写Java
%>
</body>
</html>

2、EL表达式和JSTL

EL表达式特点(四大域对象)

ServletDemo1设定:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@WebServlet("/JSTL")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.存储到request域中
req.setAttribute("username", "NewUserRequest");
req.setAttribute("status",1);

//2.转发到el-demo.jps
req.getRequestDispatcher("/el-demo.jsp-demo.jsp").forward(req,resp);

//3.遍历粗存的举例
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

jsp引用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<%--if判断--%>
<c:if test="${status} == 1">
<h1>Test Successful</h1>
</c:if>
<c:if test="${status} == 0">
<h1>Test fail</h1>
</c:if>
<%--for遍历--%>
<c:forEach items="${list}" var="item">
<h1>${item}</h1>
</c:forEach>
</body>
</html>

3、MVC模式和三层架构

七、Cookie和Session

1、Cookie

Cookie的概念:

Cookie: 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

Cookie的使用:
储存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建Cookie对象
Cookie cookie = new Cookie("username", "NewUser");
//设置存活时间
cookie.setMaxAge(60*60*24*1);
//2.发送Cookie
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
读取:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取Cookie数组
Cookie[] cookies = req.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
System.out.println(name + ":" + value);
}
break;
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Cookie不能直接储存中文,要进行URL编码:
储存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建Cookie对象
//1-1.创建中文字符串
String value = "张三";
//1-2.URL编码
value = URLEncoder.encode(value, "UTF-8");
Cookie cookie = new Cookie("username", value);
//设置存活时间
cookie.setMaxAge(60*60*24*1);
//2.发送Cookie
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
读取:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取Cookie数组
Cookie[] cookies = req.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
//URL解码
value = URLDecoder.decode(value, "utf-8");
System.out.println(name + ":" + value);
}
break;
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

2、Session

服务端会话跟踪技术,将数据保存到服务端

Session是基于Cookie实现

基本用法:
储存:
1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet(name = "SessionDemo1", value = "/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取Session对象
HttpSession session = request.getSession();
//2.存储对象
session.setAttribute("username", "NewUserSession");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
读取:
1
2
3
4
5
6
7
8
9
@WebServlet(name = "SessionDemo2", value = "/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
System.out.println(username);
}
}

JavaWeb基础1-1
https://davidpenn888.github.io/2023/05/16/JavaWeb_1_1/
作者
David Penn
发布于
2023年5月16日
许可协议