Day02 Servlet(登录案例) & ServletContext
一、Servlet
1、Servlet概述
(1)什么是Servlet
运行在服务端的Java小程序,是sun公司提供的一套规范(接口)
用来处理客户端请求,响应给浏览器的动态资源。
Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),且最重要。
(2)Servlet的作用用来处理从客户端发送过来的请求,并对其做出响应
- 获取请求数据
- 处理请求
- 完成响应
2、Servlet的访问路径
(1)什么是urlPatterns?
用来给Servlet设置访问路径
(2)两种设置方式
- 注解配置@WebServlet
其中name、urlPatterns、value都可以用来设置servlet的访问路径,但只有value可以省略变量名。 - 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接口
- 第一次调用时,将执行初始化方法:init(ServletConfig)
- 每一次调用,都将执行service(ServletRequest,ServletResponse)方法
- 服务器关闭,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配置方法共有三种
- 完全路径匹配:以/开始
例如:/ServletDemo01,/ServletDemo02/aaa - 目录匹配:以/开始,需要以* 结束, * 表示任意内容
例如:/*,/aaa/ * - 扩展名匹配:不能以/开始,以 * 开始的
例如:*.do, *.action - 缺省路径
通常情况访问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可以读取项目中文件的内容
- src下的文件:
InputStream is = Demo3FileServlet.class.getClassLoader().getResourceAsStream(“a.txt”);
- 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(); 也可以获取项目名字