目录
WEB
WEB:即网页的意思:它用于表示Internet主机上供外界访问的资源。
Internet上供外界访问的Web资源分为:
- 静态web资源(如html 页面):一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件(直接响应),返回给客户端,客户端(浏览器)解析并渲染显示出来。
- 动态web资源:一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,服务器将动态资源转换成静态资源后,再返回给客户端解析渲染处理。
-
简单区别:
其实简单来说,静态资源是客户端请求服务器,服务器直接响应内容,例如Html,css,js等。静态资源并不会根据时间点的不同而会有所变化,跟数据库不打交道。而动态资源跟数据库关联,在不同的时间点访问,服务端返回的展现效果是不同的,例如Servlet,jsp等,浏览器只能接收静态资源。
Web服务器
安装了服务器软件的计算机,本质上也是硬件,只是配置比较好。硬盘比较大,CPU核数比较多,CPU更加高级,反正就是比一般的电脑要好。
服务器软件
接收处理用户的请求,并响应用户请求的计算机软件。
Web服务器软件
- 将web项目部署到web上,让用户通过浏览器访问到这些项目。
- Web服务器接收用户的浏览器发出的Http请求,处理并响应用户请求。
常见Java相关的Web服务器软件
webLogic:oracle,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
webSphere:IBM,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,使用免费,一些文档和服务是收费的。
Tomcat:Apache基金组织,中小型JavaEE服务器,仅仅支持少量的JavaEE规范,开源免费。
Tomcat的目录层次
- Bin:存放二进制文件,启动和关闭tomcat
- Conf:配置文件,配置端口,配置数据库连接池,web.xml
- Lib:jar文件,支撑tomcat运行
- Logs:存放tomcat运行日志信息
- Temp:临时目录,给tomcat自己用的
- Webapps:存放我们要部署的项目
- Work:工作目录,区别(jsp)
-
JavaWeb应用程序
WEB应用程序指供浏览器访问的程序,通常也简称为web应用。
一个web应用由多个静态web资源和动态web资源组成,如:html、css、js文件、Jsp文件、java程序、支持jar包、相关的配置文件等等
Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。
web项目的三层结构介绍
一般web项目的结构分为三层,即DAO层,Service层、Web层。下面对这三个层次进行详细介绍:
1、DAO层又叫持久层,是用来与数据库进行交互的,即对数据库进行增删改查操作;一般会有一个BaseDAO其中包含对数据库进行纯粹的增删改、查询对象(集)、查询特殊数据等三种方法。然后对于项目中的具体业务在进行设置相应的xxxDAO,例如BookDAO,此时BookDAO是继承了BaseDAO的一个接口,然后提供一个此接口的实现类,即BookDAOImpl来具体实现BookDAO中的抽象方法。(注意在xxxDAO的实现类中,就要提供具体的sql语句了,来进行具体的查询)
2、Service层又叫业务层,是用用来连接DAO层和Web层的。在Service中提供项目具体需要的方法(比如登陆,注册等),然后通过调用对应得DAOImpl中的方法操作数据库,返回需要的数据。
3、Web层又叫视图展示层,调用Service层来处理业务,相应数据给客户端。
servlet合并
法一:html里面使用隐藏域的方法
法二:使用映射的方法
Tomcat的体系结构
详细说明:
Server代表整个Servlet容器组件,是最顶层元素,包含多个Service元素。
Service包含一个Engine元素以及多个Connector元素
Connector元素代表和客户端程序交互的组件,负责接收客户端请求和向客户端返回响应。
Engine中可以包含多个Host,Host表示一个虚拟主机,他可以包含多个web应用
Context代表运行在虚拟主机上的单个web应用
使用idea创建一个JavaWeb项目
Servlet
Servlet是sun公司提供的一门用于开发动态web资源的技术,可以实现和客户端的交互,接收客户端请求和给客户端返回响应。Servlet是Java编写的一种特殊的Java类,用于处理Web应用程序中的HTTP请求和响应。它们运行在Web服务器中,如Tomcat等,通过Servlet容器调用。Servlet可以接收来自客户端的HTTP请求并生成动态的Web内容作为响应。Servlet通常用于创建Web应用程序的后端逻辑,并与数据库或其他Web服务进行交互。Servlet还可以通过Java EE规范中的各种API实现各种功能,如会话管理、安全性和持久性。Servlet在Web开发中扮演着重要的角色,是Java Web应用程序开发的核心技术之一。
Sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源需要完成以下2个步骤:
- 编写一个Java类,实现servlet接口。
public class Servlet01 extends HttpServlet { private String code; public Servlet01() { System.out.println("Servlet01的构造方法被调用了"); } @Override public void init() throws ServletException { System.out.println("Servlet01的init方法被调用了"); ServletConfig servletConfig = this.getServletConfig(); //获取配置对象中的数据 code = servletConfig.getInitParameter("code"); } //客户端发送的请求是Get时,就会调用doGet() @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } //客户端发送的请求是Post时,就会调用doPost() @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Servlet01的doPost方法被调用了"); } @Override public void destroy() { System.out.println("Servlet01的destroy方法被调用了"); } }
- 把开发好的Java类部署到web服务器中。
<servlet> <servlet-name>RegisterServlet</servlet-name> <servlet-class>com.qf.servlet.RegisterServlet</servlet-class> <init-param> <param-name>code</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>RegisterServlet</servlet-name> <url-pattern>/register</url-pattern> </servlet-mapping>
Servlet的实现类
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
- GenericServlet是Servlet接口的实现类,但它是一个抽象类,它唯一的抽象方法就是service()方法,我们可以通过继承GenericServlet来编写自己的Servlet。
- HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。并且HttpServlet extends GenericServlet
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法
tomcat是如何将请求定位到具体的Servlet的
Tomcat是一个Web服务器和Servlet容器,负责接收客户端请求并将其路由到正确的servlet处理。下面是Tomcat如何将请求定位到具体的Servlet的简要流程:
-
当Tomcat启动时,它将扫描Web应用程序的部署描述符(web.xml)和注解,以确定所有可用的Servlet。
-
当客户端发送一个HTTP请求时,Tomcat将根据请求的URL路径和web.xml中的servlet-mapping配置来确定请求的目标Servlet。如果请求的URL与servlet-mapping的url-pattern匹配,则Tomcat将将请求发送给相应的Servlet。
-
Servlet容器会创建一个HttpServletRequest对象,其中包含了请求的所有信息,例如请求参数、请求头、请求体等。
-
Tomcat将HttpServletRequest对象和一个HttpServletResponse对象传递给目标Servlet的service()方法。
-
Servlet容器在调用service()方法之前还会调用init()方法(如果Servlet尚未初始化),并在处理完请求后调用destroy()方法(如果Servlet被销毁)。
-
Servlet使用HttpServletRequest对象中的信息处理请求,并生成一个HttpServletResponse对象,其中包含要发送给客户端的响应内容。
-
Tomcat将HttpServletResponse对象中的响应头和响应体发送回给客户端。
通过这个流程,Tomcat能够将客户端请求定位到正确的Servlet,并生成相应的响应。这使得开发人员能够使用Servlet来处理各种类型的HTTP请求,并生成动态的Web页面。
Servlet的生命周期:
第一次发送请求时:创建Servlet对象
调用构造方法
调用init方法
根据请求方式分别调用doGet、doPost方法
第二次、第三次、第n次发搜请求时:
根据请求方式分别调用doGet、doPost方法
服务器正常关闭时:destroy-销毁方法
小结:Servlet是通常情况下是单例的(该Servlet只创建一个对象)
Servlet何时被创建?
1.第一次发送请求时被创建
2.在web.xml的Servlet标签中配置了<load-on-startup>1</load-on-startup>,表示项目启动时就会创建Servlet对象,数字最小优先级越高
3.不在web.xml中配置servlet,直接在Servlet类名上添加注解的方式来配置Servlet,在注解中添加loadOnStartup = 1表示项目启动时就会创建Servlet对象,
@WebServlet(value = "/ser01",initParams=@WebInitParam(name="code",value="UTF-8"),loadOnStartup = 1)
Servlet是否是单例的?
通常情况下是单例的; 如果Servlet实现了SingleThreadModel,当该Servlet阻塞时,会新创建Servlet对象
HttpServletRequest对象
HttpServletRequest简介
定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service方法。 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
小结: 客户端请求协议都是基于HTTP所以我们选用HttpServletRequest来操作用户发送过来的请求的数据 跟请求相关信息都是去找HttpServletRequest对象!
HttpServletRequest获取表单参数
-
html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<h2>用户注册</h2>
<hr/>
<form action="UserServlet.do?action=register" method="post">
账号:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="1" checked="checked"/>男
<input type="radio" name="sex" value="0"/>女<br/>
爱好:<input type="checkbox" name="hobby" value="足球"/>足球
<input type="checkbox" name="hobby" value="篮球"/>篮球
<input type="checkbox" name="hobby" value="排球"/>排球
<input type="checkbox" name="hobby" value="悠悠球"/>悠悠球<br/>
<input type="submit" value="注册"/>
<input type="reset" value="取消"/>
</form>
</body>
</html>
-
Servlet程序
// 接收表单的值
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String[] hobby = request.getParameterValues("hobby");
// 封装成一个对象
Student s = new Student(username, password, sex, hobby);
System.out.println(s);
常见的请求方式 (get/post)
表单如果不指定,默认的请求方式是GET请求 点击超链接,直接浏览器输入地址 都属于get请求
GET请求
-
参数传递方式 GET请求在浏览器地址栏传参数,以?分割URL和传输数据,参数之间以&相连
-
数据量限制 GET提交的数据大小有限制(因为浏览器对URL的长度有限制)
-
安全问题 GET方式提交数据,会带来安全问题(地址栏显示出来)
-
乱码处理方式 每个参数都要处理
Tomcat8的版本中GET基本就不会乱码了,因为服务器对url的编码格式可以进行自动转换
GET优点
-
效率高
-
使用get场合:传递少量的非敏感的参数
POST请求
-
参数传递方式 POST方法是把提交的数据放在HTTP包的Body中(地址栏看不到)
-
数据量限制 POST方法提交的数据没有限制 (文件上传必须是POST)
-
安全问题 POST提交的数据相对安全
-
乱码处理方式 统一处理所有
POS优点
-
安全性好
-
传递数量大
-
文件上传必须是POST请求(后期讲)
注册案例
注册功能分析
注册的本质:将用户填写的数据添加到数据库的过程。
注册页面register.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<style type="text/css">
*{font-size:14px;}
td:first-child{text-align:right;}
td:last-of-type a{vertical-align:middle;}
a:ACTIVE,a:VISITED {color:blue;}
#checkImg{vertical-align: middle;}
</style>
</head>
<body>
<center>
<form action="/register/regServlet" method="post">
<table>
<tr>
<td>用户名:</td>
<td>
<input type="text" name="username"/>
<font color="red"> *</font>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input type="password" name="password"/>
<font color="red"> *</font>
<font id="passwordMsg" color="red"></font>
</td>
</tr>
<tr>
<td>确认密码:</td>
<td>
<input type="password" name="repassword"/>
<font color="red"> *</font>
<font id="repasswordMsg" color="red"></font>
</td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" name="age"/></td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女
</td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<td>生日:</td>
<td><input type="text" name="birthday" /></td>
</tr>
<tr>
<td>擅长的技术:</td>
<td>
<input type="checkbox" name="hobby" value="C"/>C
<input type="checkbox" name="hobby" value="C++"/>C++
<input type="checkbox" name="hobby" value="Java"/>Java
<input type="checkbox" name="hobby" value="IOS"/>IOS
<input type="checkbox" name="hobby" value="PHP"/>PHP
<input type="checkbox" name="hobby" value="Android"/>Android
</td>
</tr>
<tr>
<td>地址:</td>
<td>
<select name="address">
<option value="none">--请选择地址--</option>
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="南京">南京</option>
<option value="广州">广州</option>
<option value="深圳">深圳</option>
</select>
</td>
</tr>
<tr>
<td>自我描述:</td>
<td>
<textarea cols="50" rows="5" name="description"></textarea>
</td>
</tr>
<tr>
<td></td>
<td style="text-align:left;padding-top:10px;">
<input type="submit" value="注册" />
<a href="login.jsp">登录</a></td>
</tr>
</table>
</form>
</center>
</body>
</html>
注册的Servlet
package servlet.request;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.JDBCUtils;
@SuppressWarnings("all")
public class RegisterServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 解决响应乱码问题
response.setContentType("text/html; charset=UTF-8");
// 解决请求中的中文乱码问题:只能解决post请求的乱码
request.setCharacterEncoding("UTF-8");
// 1. 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String age = request.getParameter("age");
String sex = request.getParameter("sex");
String email = request.getParameter("email");
String birthday = request.getParameter("birthday");
// 爱好是多值,需要使用getParameterValues获取
String[] hobby = request.getParameterValues("hobby");
String hobbies = "";
for (String h : hobby) {
hobbies += "," + h;
}
// ,1,2,3
hobbies = hobbies.substring(1);
String address = request.getParameter("address");
String description = request.getParameter("description");
// 将数据入库
// 获取连接对象
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = JDBCUtils.getConnection();
pstmt = conn.prepareStatement("insert into user values(null,?,?,?,?,?,?,?,?,?)");
pstmt.setString(1, username);
pstmt.setString(2, password);
pstmt.setString(3, age);
pstmt.setString(4, sex);
pstmt.setString(5, email);
pstmt.setString(6, birthday);
pstmt.setString(7, hobbies);
pstmt.setString(8, address);
pstmt.setString(9, description);
pstmt.executeUpdate();
String appName = request.getContextPath();
response.getWriter().write("注册成功!<a href='"+appName+"/login.html'>立即登录</a>");
} catch (SQLException e) {
e.printStackTrace();
response.getWriter().write("系统正在维护,请稍后再试...");
} finally {
JDBCUtils.release(conn, pstmt, null);
}
}
}