回顾
1.引入
- 创建一个class,编写main方法 gui JavaSE规范
- 创建Servlet 通过浏览器访问 JavaEE规范
2.常见软件的结构
- B/S结构 Browser-Server 浏览器服务端结构
百度首页、京东首页…
特点:
1.不需要安装特定的程序,只需要安装浏览器就可以了
2.一旦服务端更新,只需要刷新浏览器即可
- C/S结构 Client-Server 客户端服务端结构
QQ、微信、360…
特点:
1.需要安装软件
2.如果服务端更新了,需要重新下载软件重新安装
3.服务器
从物理概念来说,一台PC机器就是一台服务器
web服务器:在一台PC机器上安装web服务软件
数据库服务器:在一台PC机器上安装了数据库管理的服务软件
邮件服务器:在一台PC机器上安装了邮件发送的服务软件
…
web服务器作用:将本地资源共享给外部进行访问
4.常见web服务器
IIS:window(c#)
WebLogic:BEA
WebSphere:IBM
JBoss:redhat (收费)
tomcat:apache的开源的项目(免费)
5.tomcat的使用
在Tomcat官网下载tomcat版本
两种类型:
安装版:需要安装
压缩版:直接解压就可以使用了
前提:需要配置JAVA_HOME环境变量
- bin
二进制文件目录,tomcat服务的启动与停止相关的命令
- conf
tomcat配置文件目录,配置端口号、编码格式等…
- lib
tomcat运行所依赖的jar包
- logs
tomcat运行所产生的日志文件(排查tomcat运行时的一些问题)
- temp
tomcat运行的临时文件目录
- webapps(最重要)
资源的共享目录(需要将我们需要共享给外部访问的资源放在目录中)
- work
tomcat工作目录(jsp翻译之后所产生的class字节码文件)
http://localhost:8080/web01/index.html
6.URL
统一资源定位符 用于定位网络上的一个资源
http://localhost:8080/web01/index.html
http 超文本传输协议
规定浏览器客户端与服务端通信的格式(规范)
localhost: 主机名 根据主机找到ip地址
8080:端口号 查询主机上该端口的服务 常用默认端口号:8080 tomcat ;3306 mysql服务端默认
web01: 项目名称(会默认在tomcat的webapps中去查找)
index.html 资源的名称
7.创建动态资源
7.1 动态资源、静态资源的区别
静态资源:访问一个页面时,无论刷新多少次,页面的内容都不会发生改变 html
动态资源:访问一个页面时,不断的刷新,页面的内容可能会发生变化
7.2 Servlet
概念:使用Java开发动态资源的技术
Servlet不需要程序员手动执行,是由服务器执行的
1.创建动态的web项目
目录结构
-src
源码目录
-web web项目的根目录
- WEB-INF(不要存放需要访问的资源)
- lib 添加第三方的jar包(可选)
- web.xml (必须)web项目的全局配置文件(配置servlet…)
- index.html
2.创建Servlet
第一种方式:
创建一个普通的Java类,继承HttpServlet类,重写doGet doPost方法
第二种方式:
直接创建一个Servlet
3.在web.xml中配置servlet
<!--配置servlet servlet只有配置了才能生效-->
<servlet>
<!--设置servlet的名称(任意)-->
<servlet-name>firstServlet</servlet-name>
<!--设置servlet的完整类名 (包名+类名)-->
<servlet-class>com.igeekhome.servlet.MyFirstServlet</servlet-class>
</servlet>
<!--配置servlet的访问路径-->
<servlet-mapping>
<!--与上面配置的servlet的name保持一致-->
<servlet-name>firstServlet</servlet-name>
<!--设置访问路径-->
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
8.软件的三层架构
实现代码解耦
Controller:(控制层) Sevlet
实现接收用户请求,并调用业务层进行业务处理,最终将结果响应给客户端
Service:(业务层)
主要编写业务代码,执行业务的同时,调用持久层进行数据库有关操作
Dao:(持久层)
主要就是与数据库进行交互,执行增删改查操作
9.JDBC操作
JDBC:通过Java代码操作数据库
1.加载驱动
Class.forName(“com.mysql.jdbc.Driver”);
2.获取连接对象
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/ebuy?characterEncoding=utf-8”,“root”,“root”);
3.准备SQL语句
String sql = “select * from t_user where id = ?”;
4.创建SQL的执行对象,并对SQL语句进行预编译
PreparedStatement pstmt = connection.preparedStatement(sql);
5.设置参数
pstmt.setInt(1,2);
6.执行SQL语句并获取查询结果集
ResultSet rs = pstmt.executeQuery(); //int executeUpdate() 增删改
7.解析查询结果集
如果对于查询结果最多只有一条
if(rs.next()){
rs.getInt(“id”)… 从查询结果集中获取数据
}
如果对于查询结果集有多条
while(rs.next()){
rs.getInt(“id”)… 从查询结果集中获取数据
}
8.关闭资源
先创建的后关闭
10.连接池
目前情况:
当我们在操作数据时,都需要频繁的打开与关闭资源(Connection),是非常消耗系统资源
引入连接池的概念:
初始化一个连接数组(10),如果需要创建连接的时候,直接从这个数组中获取一个连接,使用完成之后再将这个连接对象放置到数组中
技术:DBCP、C3P0…
Druid 阿里
1.下载Druid架包
druid-1.0.17.jar
2.创建连接池对象
DruidDataSource dataSource = new DruidDataSource();
3.设置连接池相关的属性
dataSource.setDriverClassName("com.mysql.jdbc.Driver");//设置驱动
dataSource.setUrl("jdbc:mysql://localhost:3306/ebuy?characterEncoding=utf-8");//设置数据库url
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setInitialSize(10);//连接池中连接的初始化大小
dataSource.setMaxActive(20);//设置最大的活跃数量
//...
4.获取连接
//3.从连接池中获取连接对象
Connection connection = dataSource.getConnection();
11.DBUtils
简化持久层操作(Dao)
private QueryRunner queryRunner = new QueryRunner(JDBCUtil.druidDataSource());
//插入数据 小明 1 江苏南京
@Test
public void insertData() throws SQLException {
String sql = "insert into tb_user (username,password,phone,email,created,updated) values (?,?,?,?,?,?)";
int result = queryRunner.update(sql,"jack","888","110","110@qq.com",new Date(),new Date());//增删改都直接使用update
System.out.println(result);
}
//删除数据 删除id为3的数据
@Test
public void deleteId3() throws SQLException {
String sql = "delete from tb_user where id = ?";
int result = queryRunner.update(sql,5);
System.out.println(result);
}
//更新数据 更新id为5的数据 姓名更新为小明明 性别为0
@Test
public void updateUser() throws SQLException {
String sql = "update tb_user set username=?,password=? where id = ?";
int result = queryRunner.update(sql,"张三","666",1);
System.out.println(result);
}
//查询
@Test
public void searchAllUser() throws SQLException {
String sql = "select * from tb_user";
List<User> users = queryRunner.query(sql,new BeanListHandler<>(User.class));
for(User user : users){
System.out.println(user);
}
}
//根据id获取用户 查询id为5 的用户信息
@Test
public void searchUserById() throws SQLException {
//1.创建QueryRunner对象(sql操作对象)
String sql = "select * from tb_user where id = ?";
//2.执行sql语句 (要保证数据库表的字段名需要与实体的属性名要一致、
//参数: 1.sql语句 2.转换的方式 BeanHandler (查询单个对象)将查询结果集转换成一个对象 3.参数 (可变参数)
User user = queryRunner.query(sql,new BeanHandler<>(User.class),1);
System.out.println(user);
}
12.HttpServeletRequest&HttpServletResponse
HttpServletRequest 请求(客户端(浏览器)->服务器)
针对request对象,能够获取客户端传递的参数
String getParameter(String name)
根据指定名称获取客户端传递参数
Map getParameterMap()
返回所有的客户端传递的参数(map)
String[] getParameterValues(String name)
根据指定名称获取客户端传递参数(多选框)
HttpServletResponse 响应对象 (服务端->客户端)
针对response对象,设置响应信息(响应头,响应行,响应体)
案例:
可以通过设置响应头来控制客户端以何种编码加载页面
response.setHeader("Content-type","text/html;charset=utf-8");
案例:
设置响应状态码
response.setStatus(202);//设置状态码 一般不建议修改
13.GET POST区别
GET:
- 参数是拼接在url后面的,使用?拼接参数,多个参数之间使用&连接
http://localhost:8088/myweb_01/login?username=admin&password=123
- GET请求参数大小是有限制的,一般不超过1kb
- GET请求不适合提交一些敏感数据
- 默认浏览器直接访问,默认的访问方式是GET
POST:
- 参数是放在请求体中的,不会拼接在url后
- POST请求数据大小是没有限制的(文件上传)
- POST请求适合做敏感数据提交
中文乱码问题:
POST请求乱码:
username = new String(username.getBytes("iso-8859-1"),"utf-8");
GET请求乱码:
request.setCharacterEncoding("utf-8");//解决get请求中文乱码问题
今日内容
1.Servlet的生命周期
Servlet的运行不是我们程序员运行的,而是交给服务器运行
之前 Java GirlFriend gf = new GirlFriend(); gf = null;
- 构造方法 一次
- init 初始化方法 一次
- service 方法 真正对用户请求进行处理的方法 多次
- destroy 销毁方法 关闭浏览器的时候执行 一次
http://localhost:8080/myweb_01/first
first->FirstServlet
默认情况下,servlet只有在访问的时候才会创建、
当第一次访问servlet的时候,会先调用构造方法创建servle,然后调用init方法进行servlet初始化,再执行service方法对请求进行处理,根据用户用户的请求方式(GET/POST)来调用doGet doPost
第二次访问:会先判断servlet对象是否已经创建(一般情况下第一次已经创建了),所以直接执行service方法,对用户请求进行处理
问题?
servlet只有在访问的时候才会创建,如果说servlet在初始化过程中包含很多耗时操作
第一次访问就会变得很慢很慢
考虑将创建servlet的时机提前(服务器启动的时候)
<!--设置servlet创建的优先级(服务器启动的时候创建Servlet) 值越高优先级越低-->
<load-on-startup>1</load-on-startup>
2.注解的方式设置访问路径
@WebServlet("/myfirst") //设置访问路径 ,代替 web.xml中的配置
public class FirstServlet extends HttpServlet
前提是必须是web3.0以上的版本
@WebServlet("/myfirst") 默认指的是访问路径
@WebServlet(urlPatterns = "/myfirst") 等价于
注意点:
一个访问路径路径只能对应一个Servlet,但是一个Servlert能够对应多个访问路径
@WebServlet(urlPatterns = {"/myfirst","/first"})
3.页面的跳转方式
1.重定向
// /在页面跳转的时候,默认是根路径 webapps
response.sendRedirect("second");//重定向
特点:
- 路径会发生变化,变化成重定向后的资源路径
- 可以跳转到项目外部的资源
2.转发
特点:
- 转发地址不会发生改变
- 转发只能转发项目内部资源
4.页面跳转时传递参数
第一种方式:
在url后面通过?拼接参数
First:
response.sendRedirect("second?name=jack");//重定向
Second:
System.out.println("SecondServlet...执行了...");
//接收firstServlet传递过来的name
String name = request.getParameter("name");
response.getWriter().write("this is second servlet...FirstServlet:"+name);
弊端:
通过这种方式,只能传递字符串参数,如果是对象那么则不能传输
第二种方式:
通过域对象传值
域对象用于设置数据以及获取数据 ,实现在不同资源之间共享数据
域对象:PageContext **HttpServeltRequest **HttpSession ServlectContext
作用域分别是由小到大
统一的方法:
setAttribute(k,v);
getAttribute(k);
removeAttribute(k);
-
request域对象
重定向不能使用request域对象传值(重定向的两次请求不是同一个request对象)
转发能够使用request域对象传值
-
servletContext
servlet的上下文对象,也是web应用的上下文对象,代表的是整个web应用,整个项目中只有一个servletContext对象
(1)获取servlet上下文对象
ServletContext sc = request.getServletContext();
(2)通过setAttribute getAttribute 设值取值
不建议随意使用,因为servletContext对象,整个应用中只有一个,所以所有人都会共用这一个对象
统计当前网站的访问次数