Day57
1.初识Javaweb
1.1 什么是web开发
WEB,即网页的意思,它用于表示Internet主机上供外界访问的资源。
Internet上供外界访问的Web资源分为:
静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。
动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同,在Java中,动态web资源开发技术统称为Javaweb
1.2 Web容器_Tomcat
Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据
浏览器按照HTTP协议发送请求和数据,后台就需要一个Web服务器软件来根据HTTP协议解析请求和数据,然后把处理结果再按照HTTP协议发送给浏览器
1.3 JavaWeb应用程序
Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射
(1)Request是从客户端向服务端发出的请求对象,(2)Response是从服务端响应给客户端的响应对象,
(3)JSP是动态网页技术,
(4)会话技术是用来存储客户端和服务端交互所产生的数据,
(5)过滤器是用来拦截客户端的请求,
(6)监听器是用来监听特定事件,
(7)Ajax、Vue、ElementUI都是属于前端技术
1.4 Web应用的组成结构
开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错
2.编写一个web项目
1.添加web项目框架
3.上面2中右下角报黄色警告,直接点击,结跳转到这个页面
4.项目结构,html文件在web里建,Java代码在src中建
5.写完代码,配置Tomcat服务器
7.Fix修复一下
8.运行,结束
项目框架
在web里建一个Welcome的HTML文件
java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 导入css代码-->
<link rel="stylesheet" type="text/css" href="css/imgstyle.css">
</head>
<body>
<H1>欢迎页面</H1>
<img src="img/a.jfif">
</body>
</html>
编写css代码
css
img{
width:100px;
height: 100px;
border-radius: 50%;
}
运行结果:
注意:需要自己手动输出Welcome.html
将某个网页设置网站默认访问的首页WEB-INF下的web.xml中编写以下代码
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>Weclome.html</welcome-file>
</welcome-file-list>
</web-app>
3.Servlet 上
3.1 什么是Servlet
Servlet是sun公司提供的一门用于开发动态web资源的技术,可以实现和客户端的交互,接收客户端****请求*和给客户端返回*响应****。
Sun公司在其API中提供了一个Servlet接口
3.2 Servlet的实现类
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、*HttpServlet*。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,重写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法
注意:Servlet是一个接口,GenericServlet实现了Servlet接口,HttpServlet在继承了GenericServlet
3.3 案例:编写注册页面
新建数据库user表
注意:是name,而不是username
添加数据
在Welcome.html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 导入css代码-->
<link rel="stylesheet" type="text/css" href="css/imgstyle.css">
</head>
<body>
<H1>欢迎页面</H1>
<img src="img/a.jfif"> <br/>
<a href="login.html">登录</a>
<a href="register.html">注册</a>
</body>
</html>
register.html
表单里必须写name属性,才能传给服务器
前端传给后端的数据都是字符串 string
java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<h1>注册页面</h1>
<form action="#" method="post">
账号:<input type="text" name="username"/> <br/>
密码:<input type="text" name="password"/> <br/>
昵称:<input type="text" name="nickName"/> <br/>
年龄:<input type="text" name="age"/> <br/>
性别:
<input type="radio" name="sex" value="man" checked="checked">男
<input type="radio" name="sex" value="woman" >女
<br/>
爱好:
<input type="checkbox" name="hobbies" value="football">足球
<input type="checkbox" name="hobbies" value="basketball">篮球
<input type="checkbox" name="hobbies" value="shop">购物
<br/>
<input type="submit" value="注册"><br>
<input type="button" value="返回" onclick="goWeclome()"/>
</form>
<script type="text/javascript">
function goWeclome(){
window.location="Welcome.html";
}
</script>
</body>
</html>
login.html(先不写)
java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
</body>
</html>
运行一下
将Druids连接池导入到项目中,后续要操作数据库
项目结构
在Servlet包中建一个RegisterServlet的java文件
记得导servlet包,然后在项目结构操作一下
java
public class RegisterServlet extends HttpServlet {
/**
* 客户端发送请求给该Servlet,就会触发service()
* @param req 请求对象
* @param resp 响应对象
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("好好学习");
}
}
在web.xml编写前端后端到路径
xml
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.qf.Servlet.RegisterServlet</servlet-class> <!-- 全限类名 -->
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/register</url-pattern> <!-- 要加上/,前端不加/ -->
</servlet-mapping>
将注册页面服务器路径改成register,不要加/;在web.xml中要加/
根据左边的项目结构,分析web.xml中的代码
Servlet理解图:
在RegisterServlet中获取前端的name属性
hobbies特殊,因为是多选框,拿到的是多个值,用数组存储
java
public class RegisterServlet extends HttpServlet {
/**
* 客户端发送请求给该Servlet,就会触发service()
* @param req 请求对象
* @param resp 响应对象
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("UTF-8");//设置请求编码格式
// //获取请求中的数据 -- 方式一
// String name = req.getParameter("username");
// String password = req.getParameter("password");
// String nickName = req.getParameter("nickName");
// String sex = req.getParameter("sex");
// String age = req.getParameter("age");
// String[] hobbies = req.getParameterValues("hobbies");
//
// System.out.println(name);
// System.out.println(password);
// System.out.println(nickName);
// System.out.println(sex);
// System.out.println(age);
// System.out.println(Arrays.toString(hobbies));
//获取请求中的数据 -- 方式二 用这个
Map<String, String[]> parameterMap = req.getParameterMap();//获取映射对象
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry:entries){
System.out.println(entry.getKey()+"--"+Arrays.toString(entry.getValue()));
}
}
}
方式一:
方式二:
封装student实体类
java
package com.qf.pojo;
public class User {
private String username;
private String password;
private String nickName;
private String sex;
private int age;
private String hobbies;
//无参构造,有参构造,get,set,toString方法省略
}
注册页面代码
注意:sql语句中的不是username,而是name
要设置编码格式
java
public class RegisterServlet extends HttpServlet {
/**
* 客户端发送请求给该Servlet,就会触发service()
* @param req 请求对象
* @param resp 响应对象
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("UTF-8");//设置请求编码格式
resp.setContentType("text/html;charset=UTF-8");//设置响应编码格式
//获取请求中的数据 -- 方式一
String username = req.getParameter("username");
String password = req.getParameter("password");
String nickName = req.getParameter("nickName");
String sex = req.getParameter("sex");
String age = req.getParameter("age");
String[] hobbies = req.getParameterValues("hobbies");
try {
User user = DBUtil.commonQueryObj(User.class, "select * from user where name=?", username); //获取提交查询对象
if (user==null){//允许注册
//hobbies是数组,拼接字符串
StringBuffer sb = new StringBuffer();
for (String hobby:hobbies){
if(sb.length() != 0){
sb.append(",");
}
sb.append(hobby);
}
//注册成功,将数据添加到数据库中
DBUtil.commonUpdate("insert into user(name,password,nickName,sex,age,hobbies) values(?,?,?,?,?,?)",username,password,nickName,sex,age,sb.toString());
resp.getWriter().println("<h1>注册成功<h1/>");
}else {//不允许注册
resp.getWriter().println("<h1>注册失败,账号已重复<h1/>");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
运行结果
总结
1.Tomcat
理解什么是动态Web资源
配置。。。。
2.Serlvet理解
Servlet、GenericServlet、HttpServlet的关系
Servlet如何创建:
a 创建类(RegisterServlet),继承HttpServlet
b 重写service方法
c 在web.xml中配置
学习注册功能