jsp与servlet 01

回顾

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

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对象,整个应用中只有一个,所以所有人都会共用这一个对象

统计当前网站的访问次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值