Day02 Servlet & ServletContext

Day02 Servlet(登录案例) & ServletContext

一、Servlet

1、Servlet概述

(1)什么是Servlet
运行在服务端的Java小程序,是sun公司提供的一套规范(接口)
用来处理客户端请求,响应给浏览器的动态资源。
Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),且最重要。
(2)Servlet的作用用来处理从客户端发送过来的请求,并对其做出响应

  1. 获取请求数据
  2. 处理请求
  3. 完成响应

2、Servlet的访问路径

(1)什么是urlPatterns?
用来给Servlet设置访问路径
(2)两种设置方式

  1. 注解配置@WebServlet
    其中name、urlPatterns、value都可以用来设置servlet的访问路径,但只有value可以省略变量名。
  2. xml配置

3、Servlet传统配置方式(了解)

(1)本质就是xml配置
(2)在项目中xml配置用的少
(3)地址如何找到Servlet?
在这里插入图片描述

4、Servlet的生命周期(了解)

(1)什么是生命周期?
就是一个对象从创建到销毁的过程
(2)Servlet继承关系
实现Servlet接口
GenericServlet实现Servlet接口
HttpServlet继承GenericServlet
MyServlet继承HttpServlet

5、Servlet的生命周期方法(了解)

(1)Servlet生命周期:Servlet从创建到销毁的过程​ 何时创建:用户第一次访问Servlet创建Servlet的实例(单实例)​ 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候
(2)Servlet规范规定,所有的servlet必须实现javax.servlet.Servlet接口

  1. 第一次调用时,将执行初始化方法:init(ServletConfig)
  2. 每一次调用,都将执行service(ServletRequest,ServletResponse)方法
  3. 服务器关闭,destroy()方法
    在这里插入图片描述
@WebServlet("/demo02")
public class Demo02LifeServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        //第一次访问servlet时执行init方法,初始化,只需要一次
        System.out.println("I am init method");
    }

    @Override
    public void destroy() {
        //正常关闭服务器
        System.out.println("I am destroy method");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //每次访问servlet时就会执行一次service方法
        System.out.println("I am service method");
    }
}

6、Servlet的url-pattern路径

(1)url-pattern配置方法共有三种

  1. 完全路径匹配:以/开始
    例如:/ServletDemo01,/ServletDemo02/aaa
  2. 目录匹配:以/开始,需要以* 结束, * 表示任意内容
    例如:/*,/aaa/ *
  3. 扩展名匹配:不能以/开始,以 * 开始的
    例如:*.do, *.action
  4. 缺省路径
    通常情况访问html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet。

二、测试驱动开发TDD

1、什么是测试驱动开发?

测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。

2、有什么特点?

先编写测试代码–主要逻辑
再写功能代码–再实现细节
通过测试来推动整个开发的进行
这有助于编写简洁可用和高质量的代码,并加速开发过程。

3、Junit

(1)为什么使用Junit?
测试一个类的多个方法,如果使用main方法,不便利细粒度测试
(2)JUnit是一个Java语言的单元测试框架。
(3)junit是在极限编程和重构(refactor)中被极力推荐使用的工具
(4)Junit的注解
@Test:在测试方法上加,类似main独立运行。
@Before:标记的方法,运行在@Test之前,如:初始化。
@After:标记的方法运行在@Test方法之后,如:销毁

三、综合案例

1、登录功能

在这里插入图片描述

2、代码实现

(1)用户类

public class User {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

(2)实现login.html

<form method="post" action="/web02_login/login">
  <input type="text" name="username"><br>
  <input type="password" name="password"><br>
  <input type="submit" value="提交">
</form>

(3)实现Servlet

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request,response);
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//获取参数
    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    		//处理参数
    		UserService service = new UserService();
    		boolean b = service.login(username, password);

    		response.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		//根据返回结果提示用户
    		if (b){
    			//响应给浏览器
        		response.getWriter().println("登录成功");
    		}else{
        		response.getWriter().println("账号密码错误");
    		}
    	}
}

(4)实现Service

public class UserService {
    public boolean login(String username,String password){
        UserDao dao = new UserDao();
        return dao.login(username,password);
    }
}

(5)实现Dao

public class UserDao {
    public boolean login(String username,String password){
        DB db = new DB();
        return db.query(username,password);
    }
}

(6)实现DB User模拟数据库

public class DB {
    //创建集合存储数据
    private static ArrayList<User> list = new ArrayList<User>();
    static {
        list.add(new User("jack","1234"));
        list.add(new User("rose","2234"));
    }

    public static boolean query(String username,String password){
        //遍历集合,找出是否有相同的组合
        for(User u : list){
            if (username.equals(u.getName())&&password.equals(u.getPassword())){
                return true;
            }
        }
        return false;
    }
}

四、ServletContext

1、什么是ServletContext

(1)ServletContext是Servlet中自带的一个对象
(2)ServletContext对象时在第一次访问Servlet时,自动创建
(3)一个项目中只有一个ServletContext对象

2、ServletContext的作用

(1)ServletContext可以实现多个Servlet之间数据的共享
在这里插入图片描述(2)ServletContext可以读取项目中文件的内容

  1. src下的文件:

InputStream is = Demo3FileServlet.class.getClassLoader().getResourceAsStream(“a.txt”);

  1. web目录下文件:

InputStream is = getServletContext().getResourceAsStream(“a.txt”);

(3)ServletContext可以读取全局配置参数

getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1.获取servletContext对象
    ServletContext context = getServletContext();
    //2.打印(从web.xml中获取)
    String s = context.getInitParameter("ip");
    //打印所有参数            
    //1.先获取所有全局配置参数名称            
    Enumeration<String> enumeration =  getServletContext().getInitParameterNames();
    //2.遍历迭代器            
    while(enumeration.hasMoreElements()){                     
    	//获取每个元素的参数名字                     
    	String parameName = enumeration.nextElement();                     
    	//根据参数名字获取参数值                     
    	String parameValue = getServletContext().getInitParameter(parameName);                         		//打印                     
    	System.out.println(parameName+"="+parameValue);            
    }	
}

web.xml

<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->
<context-param>  
	<param-name>ip</param-name>  
	<param-value>192.168.31.72</param-value> 
</context-param>
<context-param>          
	<param-name>param1</param-name>          
	<param-value>value1</param-value>   
</context-param>

(4)可以搜索当前工程目录下面的资源文件
核心方法

getServletContext().getRealPath(path),根据相对路径获取服务器上资源的绝对路径
getServletContext().getResourceAsStream(path),根据相对路径获取服务器上资源的输入字节流

(5)可以获取当前工程名字
核心方法

getServletContext().getContextPath();

作用:获取当前工程名字

String contextPath = request.getContextPath(); 也可以获取项目名字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值