小白学习Java第三十三天

今日内容

  1. web服务器(tomcat)
  2. idea创建web项目并部署运行
  3. Servlet入门

如何创建Servlet

Servlet生命周期

Servlet进化史

  1. 使用Servlet实现登录案例

一.Web服务器介绍

(一)简介

Web服务器一般指网站服务器,也称之为WWW(World  Wide  Web)服务器。是指驻留于因特网上某种类型计算机的程序。这个服务器并不是硬件服务器,而是软件服务器。其主要功能是提供网上信息浏览服务,可以向发出请求的浏览器提供文档,也可以放置网站文件,让全世界浏览;还可以放置数据文件,让全世界下载等。

作用:Web服务器主要用来接收客户端发送的请求和响应客户端请求。

  • 常见的服务器
  1. TomcatApache:当前应用最广的JavaWeb服务器,专为javaweb提供
  2. JBossRedhat红帽):支持JavaEE,应用比较广EJB容器 –> SSH轻量级的框架代替
  3. GlassFishOrcale):Oracle开发JavaWeb服务器,应用不是很广;
  4. ResinCaucho): 支持JavaEE,应用越来越广;
  5. WeblogicOrcale):要钱的!支持JavaEE,适合大型项目;
  6. WebsphereIBM):要钱的!支持JavaEE,适合大型项目。

二.Tomcat服务器

(一)介绍

         Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

         Tomcat服务器实际上是JSP 页面和Servlet的容器,主要用来部署和运行Web应用。另外,Tomcat也具有处理HTML页面的功能。

 

  • 下载使用

下载官网地址:https://tomcat.apache.org

注:tomcat版本可选,课程中使用8.5版本

 

下载后解压目录如下:

 

启动和关闭服务器

Tomcatbin目录下双击startup.bat文件

 

此时通过HTTP协议访问Tomcat服务,如果看到以下页面表示服务开启成功。

tomcat首页访问地址:http://localhost:8080

http: 协议名

Localhost: 地址

8080: 端口号

关闭服务可以直接将启动的Tomcat窗口关闭或双击bin目录下的shutdown.bat批处理文件。如果服务关闭,则无法访问tomcat服务首页。

 

注意事项:必须保证配置了JDK的环境变量,否则启动不成功或出现闪退情况。

  • Idea中创建JavaWeb工程

(一)创建web工程

双击打开idea开发工具:

 

创建web工程:

 

 

 

如果不能直接创建web项目,先创建一个普通java工程,然后通过选中项目名,鼠标右键选择:add framework....转换成web项目工程。

 

项目目录结构:

 

  • idea中配置tomcat

1.tomcat添加到idea

 

 

  1. 点击 Deployment,将项目添加到tomcat服务器

 

 

配置好tomcat就可以单击绿色箭头启动服务器

 

服务器启动成功后会自动弹出默认浏览器窗口访问项目首页:

 

 

  • Servlet入门
  • Servlet概念

         Servlet 是运行在 Web 服务器中的小型 Java 程序servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。

 

简单理解:

         我们之前讲的JDBC技术是用来实现Java语言和数据库之间的连接技术,而现在又涉及到JavaHTML进行连接,此时可以由HTML做前台,java做后台进行连接,这时候就需要一个中间件(Servlet)。

  • Servlet入门案例

创建步骤:

  1. 创建一个普通类继承HttpServlet抽象类

 

  1. 重写HttpServlet抽象类中的service方法,快捷键Ctrl+O,选择要重写的方法确定

 

 

  1. 配置Servlet

 

  1. 访问Servlethttp://localhost:8080/first

 

 

注意:需要将tomcat目录下的servlet-api.jar包复制到WEB-INF/lib目录下

 

 

(三)Servlet执行原理

实现原理:
当服务器接收到客户端浏览器的请求后,先解析请求的url路径,获取访问Servelt的资源路径
查找项目的web.xml,根据资源路径匹配web.xml中的 <servlet-mapping>中的<url-pattern> 
如果没有匹配到报 404 ,如果匹配到了根据<servlet-mapping>中的<servlet-name> 
再去匹配 <servlet>中的<servlet-name> 如果没有匹配到 404 
如果匹配到了执行<servlet> 中的<servlet-class> 从而以反射的方式访问到指定的Servlet,调用其方法。

(四)Servlet生命周期

 

servlet生命周期:从创建到销毁的全过程。共分为三个阶段:

1、初始化

2、使用(提供服务)

3、销毁

案例:创建一个Servlet重写其内部的三个方法init()service()destroy()

package com.offcn.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet{

         private static final long serialVersionUID = 1L;

         @Override

         public void init() throws ServletException {

                  System.out.println("==Servlet被初始化==");

         }

         @Override

         protected void service(HttpServletRequest req, HttpServletResponse resp)

                           throws ServletException, IOException {

                  System.out.println("==Servlet提供服务==");

         }

         @Override

         public void destroy() {

                  System.out.println("==Servlet被销毁==");

         }

}

  1. web.xml文件中注册Servlet

<!-- 注册Servlet -->

  <servlet>

      <servlet-name>MyServlet</servlet-name><!-- Servlet名称 -->

      <servlet-class>com.offcn.servlet.MyServlet</servlet-class><!-- Servlet全路径 -->

  </servlet>

  <!-- 配置Servlet虚拟路径 -->

  <servlet-mapping>

      <servlet-name>MyServlet</servlet-name><!-- Servlet名称 -->

      <url-pattern>/myServlet</url-pattern><!-- 连接前台的虚拟访问路径 -->

  </servlet-mapping>

  1. 测试查看Servlet生命周期

当我们启动tomcat服务器时,观察控制台并无打印消息,表示Servlet默认情况下在启动服务器时并未被创建。在浏览器地址栏中直接输入MyServlet的虚拟访问地址:

http://localhost:8080/day10/myServlet

此时观察控制台打印输出初始化与服务的相关信息,当多次访问该地址,发现服务方法被多次调用执行。

 

当我们关闭tomcat服务,会在控制台打印销毁方法的信息。

 

通过以上案例发现Servlet默认情况下是在第一次访问时被创建并初始化的,为了减少内存的压力,我们可否改变它的创建时机呢?

答案是肯定的。我们可以在web.xml文件中进行配置,使得Servlet在服务器启动时直接创建并初始化。

load-on-startup节点必须写在servlet节点的内部,且作为最后一个节点。取值必须是整数,如果是大于等于0的整数表示在服务器启动时就被创建并初始化,如果有多个Servlet设置了load-on-startup节点的值,那么值越小越优先执行;如果是负数则表示第一次被访问时创建并初始化,也就是默认情况,可以省略不写。

 

总结:

  1. init()初始化阶段:默情况当第一次访问Servlet时,Servlet容器(tomcat)会加载Servlet,加载完成后,Servlet容器(tomcat)会创建一个Servlet实例并调用init()方法进行初始化;如果需要改变创建时机,只需要在web.xml文件中配置load-on-startup节点值为大于等于0的整数即可。init()方法只会执行一次,也说明一个Servlet只有一个实例,即单例模式。
  2. service()服务阶段:当Servlet每被访问一次,service方法就会自动被调用一次,所以该方法可执行多次。
  3. Destroy()销毁阶段:当关闭服务或重启服务器时,destroy方法会被执行,这就标识着整个Servlet的生命周期到此结束。该方法仅被执行一次。

(五)Servlet进化史

1.第一阶段:猿人阶段(Servlet接口)

JavaEE规定了javax.servlet.Servlet接口,只要实现这个接口,那么实现类就是一个Servlet程序。

接口中有五个方法:

init()servlet程序出生时会执行的方法

service()servlet程序执行一次,一定会执行的方法

destroy()servlet程序销毁时,会执行的方法

getServletInfo():无关方法,获取Servlet说明信息

getServletConfig():无关方法,获取Servlet配置信息

程序员慢慢发现,Servlet接口中我们只关注编写service()方法,其他四个方法几乎用不到,每次实现接口又必须实现,特别麻烦。

2.第二阶段:古代社会阶段(GenericServlet抽象类)

为了不去关注Servlet接口中的其他无关方法,javaEE又提供了一个实现Servlet接口的抽象类javax.servlet.GenericServlet

GenericServlet实现了接口中其他方法,只为程序员留下了service()方法。

这样程序员只需要写一个子类,继承GenericServlet,重写service()方法,就可以快捷创建并使用Servlet

但慢慢出现了http协议,若要分别处理http协议的getpost请求,程序员还需要手动在service中书写大量代码判断。

3.第三阶段:现代社会阶段HttpServlet抽象类

为了能够自动分开处理http协议的getpost请求,javaEE又提供了GenericServlet的子类,javax.servlet.HttpServletHttpServlet仍是抽象类,但将service()方法进行了重写,并且判断请注方式是get还是post。若为get请求,调用doGet()方法,若为post请求,调用doPost()方法;程序员只需要写一个子类,继承HttpServlet,重写doGet()doPost()方法,就可以轻松写出一个能够处理http协议的强大的servlet

4.Servlet注解方式的使用

Java 注解(Annotation)又称 Java 标注,是 JDK1.5 引入的新特性。其主要作用是简化复杂的编码工作。Java 语言中的类、方法、变量、参数和包等都可以被标注,被标注的元素就具有了一些特定的功能。

Servlet的注解(@WebServlet)是Servlet3.0及以上版本支持的,主要目的是简化web.xml配置。

注意:一个Servlet的配置可以使用注解,也可以使用web.xml文件,但二者不能共存,只能任选其一,否则会报错。

 

(六)Servlet路径多元化

问题一个Servlet是否可以配置多个访问路径?  答案是可以的

url-pattern配置方式共有三种:

         1. 完全路径匹配(一层路径或多层路径) :以 / 开始                           

         例如:        /hello ,  /hello1,  /aa/hello2

         2. 目录匹配(多种路径都可以访问 排除已经指定的路径) :以 / 开始 需要以 * 结束.

         例如:       /*(所有),  /aaa/* aaa目录下的所有),  /aaa/bbb/*

         3. 扩展名匹配(后缀名) :不能以 / 开始 * 开始

         例如:  *.do ,  *.action  first.do     注意: 错误的写法 /*.do

  • Servlet登录案例

描述:用一个HTML页面将一个表单中的账号和密码传递到java类中并输出。

 

  1. 创建HTML页面并设计表单

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>登录页面</title>

</head>

<body>

         <form action="login" method="post">

                  <p>账号:<input name="username" type="text"></p>

                  <p>密码:<input name="password" type="password"></p>

                  <p><input name="sub" type="submit" value="提交"></p>

         </form>  

</body>

</html>

  1. 创建LoginServlet类继承HttpServlet抽象类,并重写其service方法

package com.offcn.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet{

         private static final long serialVersionUID = 1L;

         @Override

         protected void service(HttpServletRequest request, HttpServletResponse response)

                           throws ServletException, IOException {

                  String username = request.getParameter("username");

                  String password = request.getParameter("password");

                  System.out.println(username+"\t"+password);

         }

}

  1. web.xml文件中注册Servlet,作为前后台连接的中间件

<!-- 注册Servlet -->

  <servlet>

      <servlet-name>LoginServlet</servlet-name><!-- Servlet名称 -->

      <servlet-class>com.offcn.servlet.LoginServlet</servlet-class><!-- Servlet全路径 -->

  </servlet>

  <!-- 配置Servlet虚拟路径 -->

  <servlet-mapping>

      <servlet-name>LoginServlet</servlet-name><!-- Servlet名称 -->

      <url-pattern>/login</url-pattern><!-- 连接前台的虚拟访问路径 -->

  </servlet-mapping>

  1. 修改前台表单的action请求地址

 

5、通过浏览器输入:http://localhost:8080/day10/login.html访问

 

补充:分层开发

根据代码的功能,将项目分模块开发。最常用的三层:

表示层 负责数据的显示和接收    html  jsp 

业务逻辑层 :业务逻辑判断 (除了页面和数据访问代码以外)

数据访问层:实现对数据库的CRUD操作

好处:高内聚  低耦合   移植性好 方便项目后期维护和升级。

针对javaweb项目,MVC设计模式

M: model  javabean(实体类)

V :view  视图

Ccontroller  控制层

如何创建分层项目:

表示层:web路径下的资源    V

控制层:com.ujiuye.servlet     C

业务逻辑层:com.ujiuye.serivce

数据访问层:com.ujiuye.dao

数据模型:com.ujiuye.bean     M

表示层--->控制层--->业务逻辑层--->数据访问层

五.搭建学生管理系统项目框架

  1. 创建一个javaweb项目
  2. 按层创建包

 

  1. jar

 

  1. 先在bean包里创建Admin实体类

 

  1. dao包创建一个AdminDao,实现对admin表的crud操作

封装BaseDao工具类:

package com.ujiuye.dao;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.SQLException;
import java.util.List;

public class BaseDao<T>{
    //创建QueryRunner对象
    private  QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
    //增删改
    public  int  myupdate(String sql,Object...params) {
        try {
            return runner.update(sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  0 ;
    }

    //查询单条记录
    public  T myselect_one(String sql,Class<T> type, Object...params)  {
        try {
            return  runner.query(sql, new BeanHandler<T>(type), params);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  null;
    }

    //查询多条记录
    public List<T> myselect_multi(String sql,Class<T> type, Object...params)  {
        try {
            return runner.query(sql, new BeanListHandler<T>(type), params);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  null;
    }

    //查询单行单列
    public Object myscale(String sql,Object ...params) {
        try {
            return runner.query(sql, new ScalarHandler<>(), params);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  null;
    }

}

AdminDao:登录验证的方法login()

package com.ujiuye.dao;

import com.ujiuye.bean.Admin;

public class AdminDao extends BaseDao<Admin> {
    /*
    * 登录验证方法:返回值表示查询到的用户信息,
    * 参数:username 表示页面传递过来的用户名
    *       passowrd 表示页面传递过来的密码
    * */
    public Admin login(String username,String password){
        String sql = "SELECT * FROM admin WHERE username = ? AND PASSWORD = ?";
        return myselect_one(sql, Admin.class, username, password);
    }
}

  1. service层中创建AdminServcie,定义一login()方法,做简单的业务逻辑判断

package com.ujiuye.service;

import com.ujiuye.bean.Admin;
import com.ujiuye.dao.AdminDao;

public class AdminService {
    private  AdminDao ad = new AdminDao();
    //登录验证方法
    public boolean login(String username,String password){
        Admin admin = ad.login(username, password);
        if (admin!=null){
            return  true;
        }else{
            return false;
        }
    }

}

  1. 在控制层创建AdmiServlet

package com.ujiuye.servlet;

import com.ujiuye.service.AdminService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/login")
public class AdminServlet extends HttpServlet {
    private AdminService as = new AdminService();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //处理中文乱码问题
        resp.setContentType("text/html;charset=utf-8");
        //获取页面数据
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        //调用service层的方法登录验证
        boolean flag = as.login(uname, pwd);
        PrintWriter out = resp.getWriter();
        //判断成功与否
        if(flag){
            //成功
            out.print("<h2 style='color:green'>登录成功</h2>");
        }else{
            //失败
            out.print("<h2 style='color:red'>登录失败</h2>");
        }
    }
}

页面login.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值