javaweb基础之layui小demo练习

什么是Servlet

Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容
servlet三个技术点:
1)servlet技术
2)filter技术—过滤器
3)listener技术—监听器

快速入门

1)创建类继承HttpServlet类
2)覆盖doGet和doPost
3)在web.xml中进行servlet的配置**
Servlet的三种方式创建
实现javax.servlet.Servlet接口
继承javax.servlet.GenericServlet类(适配器)
继承javax.servlet.httpServlet(模板方法设计)
配置:
其中url-pattern的配置方式
1)完全匹配 访问的资源与配置的资源完全相同才能访问到
2)目录匹配 格式:/虚拟的目录…/* 代表任意
3)扩展名匹配 格式:
.扩展名
注意:第二种与第三种不要混用
/aaa/bbb/.abcd(错误的)
servlet映射细节1:可以在url-pattern配置多个映射路径,servlet-name相同就行
servlet映射细节2:可以在url-pattern配置通配符
可以代表任意字符串
url-pattern:.扩展名 以.字符串的请求都可以访问
url-parten:/* 任意字符串都可以访问
url-pattern:/action/* 以/action开头的请求都可以访问
匹配规则:
优先级:从高到低
绝对匹配–>/开头匹配—>扩展名方式匹配
如果url-parttern的值是/,表示执行默认映射,所有资源都是servlet
结论:url-parttern常见的写法有:

1、/*:路径匹配
2、*.do:扩展匹配
3、/HelloServlet:精确匹配
4、/test/*:长路径匹配

下面的写法是错误的:

/*.do:不能同时使用路径匹配与扩展匹配
<servlet>
        <servlet-name>LoadServlet</servlet-name>
        <servlet-class>com.doupijiang.servlet.LoadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LoadServlet</servlet-name>
        <url-pattern>/LoadServlet</url-pattern>
    </servlet-mapping>

Servlet的生命周期

1)Servlet本质上是一个类。但是使用它的时候,你好像从来没有new出来过,那么它是什么时候被创建的呢?
2)Servlet都是继承自HttpServlet的,你写代码的时候会重写父类的若干个方法,如init,doGet,doPost等,你重写这么多方法,它们之间的执行顺序又是如何呢
Servlet整个生命周期的管理,是由Servlet容器(这里是Tomcat)去维护的。
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、销毁
(1)Servlet接口中的方法
1)init(ServletConfig config)
何时执行:servlet对象创建的时候执行
ServletConfig : 代表的是该servlet对象的配置信息
2)service(ServletRequest
request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息
ServletResponse :代表响应 认为要封装的是响应的信息
3)destroy()
何时执行:servlet销毁的时候执行
(2)HttpServlet类的方法
1)init()
2)doGet(HttpServletRequest request,HttpServletResponse response)
3)doPost(HttpServletRequest request,HttpServletResponse response)
4)destroy()
(3)Servlet的生命周期(面试题)
1)Servlet何时创建
默认第一次访问servlet时创建该对象
2)Servlet何时销毁
服务器关闭servlet就销毁了
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法
servletconfig获取servlet基本信息

servletconfig

获取web.xml 中init-param里面的初始化参数

 <servlet>
    <servlet-name>CheckServlet</servlet-name>
    <servlet-class>com.qianjiang.item.CheckServlet</servlet-class>
 <init-param>
      <param-name>username</param-name>
      <param-value>doupijiang</param-value>
    </init-param>
    <init-param>
      <param-name>password</param-name>
      <param-value>123456</param-value>
    </init-param>**
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckServlet</servlet-name>
    <url-pattern>/show/CheckServlet</url-pattern>
  </servlet-mapping>
//getServletConfig()实际上就是init的config对象
		ServletConfig servletConfig =  this.getServletConfig();
        //从配置获取用户名和密码
        String name = servletConfig.getInitParameter("username");
        String pwd = servletConfig.getInitParameter("password");
        System.out.println("内置用户名"+name);
        System.out.println("内置密码"+pwd);

或者直接:

		@WebServlet(urlPatterns = "/HanderServlet",initParams =
        {@WebInitParam(name = "r_username",value = "admin"),
        @WebInitParam(name = "r_password",value = "admin")})

ServletContext

ServletContext:代表的是整个应用,一个应用只有一个ServletContext对象。单实例
域对象:在一定范围内(当前应用),使多个Servlet共享数据
ServletContext是一个域对象
什么是域对象?什么是域?
存储数据的区域就是域对象
ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)
域对象的通用的方法:
setAtrribute(String name,Object obj);//向ServletContext对象的Map中添加数据
getAttribute(String name);从ServletContext对象的map中取数据
removeAttribute(String name);//根据name移除数据
获取全局配置信息
web.xml配置全局初始化参数

<context-param>
	<param-name>driver</param-name>
	<param-value>com.mysql.jdbc.Driver<param-value>
</context-param>

通过context对象获得参数

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获得ServletContext对象
        ServletContext context = this.getServletContext();
        //获得初始化参数
        String initParameter = context.getInitParameter("driver");
        //System.out.println(initParameter);
        resp.getWriter().write(initParameter);
    }

获得web应用中任何资源的绝对路径
方法:String path = context.getRealPath(相对于该web应用的相对地址);
例子:ServletContext context = getServletContext();
String path = context.getRealPath("/WEB-INF/classes/com/xxx/a.properties");
String path = context.getRealPath("/WEB-INF/classes/a.properties");
String path = context.getRealPath("/WEB-INF/a.properties");

InputStream is = getServletContext().getResourceAsStream(/WEB-INF/classes/com/xxx/a.properties);
Properties pro = new Properties();
pro.load(is);
String user = prop.getProperty("username");

Servlet的请求转发

实现请求转发,目标是跳转到ServletContextDemo
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/ServletContextDemo1");参数表示要跳转到哪去
rd.forward(request,response);//将请求信息向下传递
req.getRequestDispatcher(“PrintServlet”).forward(req,resp);

请求转发和重定向的区别

重定向:

response.sendRedirect("/student_list.jsp"); 

总结
转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同请求
转发地址栏没有变化;重定向地址栏有变化
转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
问:什么时候使用转发,什么时候使用重定向?
如果要保留请求域中的数据,使用转发,否则使用重定向。
以后访问数据库,增删改使用重定向,查询使用转发。
无论转发或重定向后续的代码都会执行

Servlet的注解形式

metadata-complete="false"需要为false。这样注解才会成功

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="false">



</web-app>

注:必须要使用tomcat7以上的服务器
 在Servlet3.0中,可以使用@WebServlet注解将一个继承于javax.servlet.http.HttpServlet的类标注为可以处理用户请求的Servlet。

@WebServlet注解的相关属性
1.asyncSupported:声明Servlet是否支持异步操作模式
2.description:Servlet的描述信息
3.displayName:Servlet的显示名称
4.initParams:Servlet的初始化参数
5.name:Servlet的名称
6.urlPatterns:Servlet的访问URL
7.value:Servlet的访问URL
Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。
  像上面的Servlet3Demo可以描述成@WebServlet(name=“Servlet3Demo”,value="/Servlet3Demo")。
  也定义多个URL访问:
  如@WebServlet(name=“Servlet3Demo”,urlPatterns={"/Servlet3Demo","/Servlet3Demo2"})
  或者@WebServlet(name=“AnnotationServlet”,value={"/Servlet3Demo","/Servlet3Demo2"})

Cookie简讲

学习之前需要了解:
1、 Http是无状态的短连接,而TCP是有状态的长连接
Http协议(超文本传输协议),应用层
TCP协议(传输控制协议),传输层
Http就是在每次请求完成后就把TCP连接关了,所以是短连接。而我们直接通过Socket编程使用TCP协议的时候,因为我们自己可以通过代码区控制什么时候打开连接什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着
cookie是浏览器的一种缓存机制,服务端给客户端的数据,存储于客户端(浏览器)。由于是保存在客户端上的,所以存在安全问题,并且cookie是由个数和大小限制的(4KB),所以一般cookie用来存储一些比较小且安全性要求不高的数据,而且一般数据都会进行加密
比如保存登录信息,购物车信息,网页主题保存等

public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        
        resp.getWriter().write("用户上次访问服务器的时间是:");
        //获取浏览器的cookies
        Cookie[] cookies = req.getCookies();
        //判断是否为空
        if(cookies!=null){
            for(Cookie c:cookies){
                if(c.getName().equals("qj")){
                    System.out.println(c.getValue());
                   resp.getWriter().write(c.getValue());
                }
            }
        }

        //浏览器存储cookie信息

        Cookie c = new Cookie("qj","豆皮江");
        //设置cookie有效期(没有设置过期时间,关闭浏览器cookie就失效)
        c.setMaxAge(30*24*60);
        // 存储cookie
        resp.addCookie(c);
    }

Cookie来实现几天免登录小案例:

public class FreeLogin extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String u_username = req.getParameter("username");
        String p_password = req.getParameter("password");
        if(p_password.equals("222222")&&u_username.equals("li111111")){
            String free = req.getParameter("freeLogin");
            if(free!=null){
                System.out.println("开启了三天自动登录");
                //将用户名和密码存放在了cookie,然后让前端获取cookie的信息,并存在浏览器中
                Cookie usernameCookie=new Cookie("username",u_username);
                Cookie passwordCookie = new Cookie("password",p_password);
                usernameCookie.setPath(req.getContextPath()+"login.jsp");//cookie信息设置在登录页 为了下次登录直接获取到cookie的信息
                passwordCookie.setPath(req.getContextPath()+"login.jsp");//cookie信息设置在登录页 为了下次登录直接获取到cookie的信息
                //设置过期时间
                usernameCookie.setMaxAge(60*60*24*3);
                passwordCookie.setMaxAge(60*60*24*3);

                //冲刷到前端
                resp.addCookie(usernameCookie);
                resp.addCookie(passwordCookie);
            }
            //最后间接请求转发到成功页面
           req.getRequestDispatcher("success.jsp").forward(req,resp);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

前端页面:

<%@ page contentType="text/html;charset=UTF-8" language="java"
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值