JavaWeb学习笔记

一.刨析JDBC

1.概念:

JDBC就是java语言操作关系型数据库的一套API

2.常用API

2.1DriverManager :

作用1.注册驱动 2.获取数据库连接;都是静态方法,直接类名.方法

2.2Connection:

作用1.获取sql执行对象 2.事务管理 《《关于管理事务回滚常用方法setAutoCommit() commit() ,rollback()

2.3Statement :

作用执行SQL语句 《《常用方法 executeUpdate();//执行DML(增删改操作),DDL,DML返回受影响的行数,如果执行DDL,执行成功也可能返回0 executeQuery(sql)执行DQL语句,返回ResultSet(结果集对象)

2.4对DML,DDL,DQL,DCL解释

DDL(数据定义语言) :主要用于定义数据库中的各类对象,包括用户,库,表,视图,索引触发器,事件,存储过程和函数等。

DCL(数据控制语言):用于控制不同数据段直接的许可和访问级别的语句,这些语句定义了数据库,表,字段,用户的访问权限和安全级别。

DML(数据操作语言):用于增删改 数据库记录,并检查数据完整性.主要有INSERT,UPDATE,DELETE

DQL(数据查询语言):主要用来查看表中的数据,也是平时用的最多的。主要SELECT

2.5ResultSet

接收executeQuery返回的对象

常用方法:next();判断下一行是否有数据

getInt/Double/String();获取数据库中的数据

2.6PrepareStatement

继承自Statement

作用:预编译SQL语句并执行,预防sql注入问题

3.数据库连接池

3.1数据库连接池简介

一个容器,负责分配,管理数据库连接

好处: 资源重用,提升系统相应速度 。避免数据库连接遗漏

3.2数据库连接池实现

常见的 数据库连接池

1.DBCP 2.C3p0 3.Druid(阿里巴巴开源的数据库连接池项目 功能强大,性能优秀)

标准接口 DataSource ()

功能获取连接

Connection getConnection()

二.JavaWeb

1.Servlet (java小程序)

1.1关于系统架构

有b/s:Browser/Server (浏览器/服务器)

优点:升级维护方便,成本低,不需要安装特定客户端软件

缺点:速度慢,体验差,不安全。

c/s架构:client/server (客户端 /服务器) 例如qq

优点:速度块,体验好,界面酷炫,服务器压力小,安全

缺点:升级维护比较麻烦

1.2B/S结构通信原理

在访问网站过程中,www.ip:port/资源路径

url:统一资源定位符

当前主机在网络中用ip定位服务器,当前主机向服务器发送请求,服务器向主机响应,端口用于定位服务器中的软件

 

2关于WEB服务器软件

  • 分为web服务器和应用服务器,常见的应用服务器有JBOSS ,WebLogic,WebSphere

常见的Web服务器有Tomcat,jetty

  • 应用服务器实现了JavaEE中的所有13个规范,而web服务器中只实现了Servlet+jsp两个规范

    所以应用服务器中包含了web服务器

  • tomcat:开源免费的轻量级WEB服务器

  • 《java的13个规范》1、JDBC(java Database Connectivity,Java数据库连接): 负责数据库访问。

    2、JNDI(Java Name and Directory Interface, Java名称与目录接口): 根据名称和文件目录获取数据,如数据库连接时配置数据源,根据数据源名称,在配置文件中查找连接数据。

    3、EJB(Enterprise Java Bean,企业级Java Bean): 将业务逻辑从客户端软件中抽取出来,封装组件中,运行在一个独立的服务器上。客户端软件通过网络调用组件提供的服务以实现业务逻辑,客户端功能只负责发送调用请求和显示处理结果。运行在独立的服务器上,封装了业务逻辑的组件就是EJB组件。EJB基础是RMI(Remote Method Invocation,远程方法调用)。

    4、RMI(Remote Method Invocation,远程方法调用): 通过RMI,将EJB组件创建为远程对象,客户端利用对象序列化和反序列化,通过网络调用EJB对象。RMI是RPC(Remote Procedure Call,远程过程调用)在Java中的实践。JDK/bin下有rmic.exe(编译器,生成stub(存根)和skeleton(骨架))、rmiregistry.exe(为rmi提供命名服务,把名字和对象关联在一起)、rmid.exe(支持rmi激活)。

    5、Java IDL(Interface Definition Language,接口定义语言)/CORBA(Common Object Request Broker Architecture,公共对象请求代理结构): JDK/bin下的idlj.exe将IDL文件解析成对应的Java文件,结合org.omg.CORBA等org.omg里的JavaAPI生成服务端和客户端代码。通过JDK/bin下的orbd.exe启动服务。客户端对本地对象的调用映射到对服务端对象的调用。和RMI有相同的目标。 推荐:IDL简介与corba入门案例 - 红日悬天 - 博客园

    6、JSP(Java Server Pages,Java 服务端页面): JSP由html和嵌入的Java代码组成。server收到client请求后处理java代码,然后将新的网页返回给client。

    7、Java Servlet(Java 小型服务端应用程序): 响应用户请求,可以动态创建网页。

    8、XML(Extensible Markup Language,可扩展标记语言): XML是一种能够用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是互相独立的,可是,它和java具有同样目标正是平台独立。通过java和xml的组合,我们能够得到一个完美的具有平台独立性的解决方式。

    9、JMS(Java Message Service,Java消息服务): 负责消息发送和接收。JMS两种类型:点对点(请求、响应,Pull)模式;发布、订阅(Push)模式。消息中间件:Kafka、RabbitMQ、ActiveMQ等。 JMS(Java平台上的专业技术规范)_百度百科

    10、JTA(Java Transaction API,Java事务API): 任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接、JDO (Java Data Object )PersistenceManager(持久管理器)对象、JMS队列、JMS主题、企业JavaBeans(EJB)、一个用J2EE Connector Architecture 规范编译的资源分配器。 jta_百度百科

    11、JTS(Java Transaction Service,Java事务服务): JTS是一个组件事务监视器(Component Transaction Monitor)(有时也称为对象事务监视器(Object Transaction Monitor))

    12、JavaMail(Java Mail,Java邮件): JavaMail是处理电子邮件的API。

    13、JAF(JavaBeans Activation Framework,Java对象激活框架): JAF是一个专用的数据处理框架,用于封装数据,并为应用程序提供访问和操作数据的API。对数据源进行查看、编辑和打印等操作。

2.1Tomcat 服务器启动

  • bin 下的stratup.bat.. bat文件打开在cmd窗口执行相应的命令(windows使用)

stratup.sh sh文件执行文件中的shell命令(linux使用)

通过分析startup.bat发现找到了catalina.bat,打开startup.bat实际是执行catalina.bat

而catalina.bat有这样的配置 MAINCLAAS=org.apache.catalina.startup.Bootstrap(main方法所在的类)

得:::启动Tomcat就是在执行main方法

  • 配置了那些环境变量 JAVA_HOME :路径

    CATALINA_HOME :路径

    path: %JAVA_HOME%\bin ; %CATALINA_HOME%\bin

    启动Tomcat :cmd中输入startup (执行对应的bin下的bat文件) 关闭 cmd输入stop(将之前shutdown改名了,原因shutdown和windows中关机命令相同)

  • 实现一个最基本的web应用(没有java小程序)

    1. 找到CATALINA_HOME/webapps目录;;;;《因为所有的webapp要放到webapps目录下》

    2. 在CATALINA_HOME/webapps目录下新建一个子目录,起名oa,(oa就是这个webapp的名字)

    3. 在oa目录下新建资源文件。例如 index.html

    4. 启动tomcat

    5. 打开浏览器,输入网址 127.0.0.1:8080/oa/index.html

    login 
    login 

    以上两种效果是一样的,不同的是2用了绝对路径

2.2BS结构系统中的角色和协议

  • 有那些角色(在整个BS系统结构中,有那些人参与进去了)

    浏览器软件的开发团队(火狐,谷歌)

    web Server 开发团队(tomcat,jetty,Weblogin,JBOSS)

    DB Server开发团队’(Oracle,mtsql)

    webapp开发团队(我们作为java程序猿开发的)

  • 角色与角色之间遵守那些协议

    webapp的开发团队和webServer 开发团队有一套规范,javaee规范之一Servlert规范

    《《Servlet规范作用,web Server 和webapp解耦合

    Browser和WbeServlet之间有一套传输协议:http协议

    webapp和DBserver 之间有JDBC协议

3.Servlet

为了解决用户和浏览器动态交互的问题,到了1997年,SUN 公司(发明了JDK) 推出了Servlet技术。

Servlet 是一个基于 Java 技术开发的 web 组件,它运行在服务器端,由 Servlet容器管理。主要用于处理用户的请求并生成动态的信息。

 

作者:知否技术 链接:https://juejin.cn/post/7041784126701043749 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3.1开发一个带有Servlet的webapp

1.在tomcat里的webapp文件夹里新建一个文件(crm)(crm就是这个webapp的名字)

2.在crm下新建一个目录WEB-INF(Servlet规范大小写也得一样,不能改)

3.在WEB-INF下新建一个目录classes(也是Servlet规范大小写也得一样,),存放的是java程序编译子后的class文件(字节码文件)3

4. 在WEB-INF下新建一个lib目录(bushi必须),放jar包
  1. 在WEB-INF下新建一个web.xml(必须)文件,配置信息

  2. 编写java程序,这个程序必须实现Servlet接口

  3. 编写helloServlet, 生成class文件放到classes中

  4. 在web.xml中注册信息,

  5. html文件放到WEB-INF外面

  6. webapp目录结构

    webappname
        !-------WEB-INF
            !------classes(存放字节码)
            !-----lib(第三方jar包)
            !-----web.xml(注册Servlet)
        !--------html
        !--------css
        !--------js
        !--------image
        .....

    在浏览器中输出

    public void service(ServletRequest request,ServletResponse response)
            throws ServletException , IOException{
    ​
                //setContenetType方法设置类型
         setContenetType("text/html");
            System.out.println("My First Servlet, Hello Servlet");
    ​
            //向浏览器中打印内容
            //使用ServletResponse的getWriter()方法创建流
            PrintWriter out= response.getWriter();
            out.print("hello Servlet");
            //要打印html标签需要在之前设置类型
            out.print("

    您好,Servlet

    ");

     

3.2在Servlet链接数据库(JDBC)

在一个webapp中连接数据库,将驱动的jar包放到WEB-INF/lib目录下

3.3在集成环境中开发Servlet

1.新建一个空project

2.在project中新建一个javase Moudule

3.让javase Moudule变javaEE模块(在Moudule上右键:Add Framework Support)

4.在窗口中选择web Application

注生成的web目录就是Webapp的根

5.添加依赖,选择servlet-api.jar包和jsp-api添加到External Libraries 中

6.编写web.xml文件


        idwebname
        com.bjpowernode.javaweb.servlet.StudentServlet
    
    
        idwebname
         /servlet/webname
    

7.在绿色小锤子右边,导入tomcat服务器,后续启动是用Debug

3.4Servlet对象生命周期

1.关于servlt的生命周期是不受程序员的管理的,是由Tomcat服务器全权负责的.

  1. 默认情况下,服务器在启动的时候Servlet对象是不会被实例化的

  2. 如何启动时创建Servlet对象,在Servlet标签中添加中写正数,数字越小,优先级越高(一般情况下不用)

  3. 默认情况下,服务器在启动的时候,Aservelt对象没有被实例化。用户发送第一次请求时,创建Aservlet对象,并执行构造方法,执行init方法,然后执行service方法。再次发送请求时,执行servlce方法。

  4. 4说明了Servlet是单例的,(单实例的,Servelt对象是单实例的,但是Servlet类不符合单例模式。称之假单例。真单例模式,构造方法是私有化的)

  5. destroy方法在服务器关闭的时候执行。所以Servlet对象是在关闭服务器之后被销毁的

*当Servlet类编写一个有参数的构造方法时(并且没有无参构造方法),会报500

3.5适配器改造Servlet

  • 在开发过程中,servlet子类经常实现Servlet接口,但是基本常用的就一个service方法,不利于代码的查看,所以我们采用一个中间类(GenericServlet),去实现Servlet,将常用的Service方法改为抽象类,子类去继承GenericServlet,GenericServlet就称为适配器,后续使用就继承GenericServlet

  • ServletConfig对象在init调用时创建,但是是局部的,后续用的时候可能出问题,这里我们创建了一个变量

  • 源码部分:

            GenericServlet.java
            private  ServletConfig config;
        @Override
        public final void init(ServletConfig  Config) throws ServletException {
                this.config = Config;
                this.init();
        }
        public void init(){
            //后续调用时如果用这个创建,不会破坏config对象
        }
        @Override
        public ServletConfig getServletConfig() {
            return this.config;
        }
  
  #### 3.4 Servleconfig接口详解
  
- 存放的配置信息,在tomcat 启动是创建servlet对象之后,创建Servletconfig对象
​
- 主要方法
​
  | string              | getInitParameter(string name) | 返回name对应的value                      |
  | ------------------- | ----------------------------- | ---------------------------------------- |
  | Enumeration | getInitParmeterNames()        | 返回一个集合存放所对应的配置里的所有name |
  | ServletContext      | getServletContext()           | 返回一个Servlet对象                      |
  | String              | getServletName()              |                                          |
​
  
​
​

3.4 Servleconfig接口详解

存放的配置信息,在tomcat 启动是创建servlet对象之后,创建Servletconfig对象

  • 主要方法

    string getInitParameter(string name) 返回name对应的value
    Enumeration getInitParmeterNames() 返回一个集合存放所对应的配置里的所有name
    ServletContext getServletContext() 返回一个Servlet对象
    String getServletName()  

3.5 ServletContext

相当于一个容器对象,在一个xml配置信息中,所有的共享一个ServletContext对象,以便后续获取数据

tomcat 对这个对象进行了实现

有那些常用的反法?

​
String  getInitParameter(String name)   //通过初始化参数的name获取value       
Enumeration   getInitParameterNames()  //获取所有初始化参数的name
 //实例代码
  Enumeration initParameterNames = servletContext1.getInitParameterNames();
            while (initParameterNames.hasMoreElements()){
                String name = initParameterNames.nextElement();
                String value = servletContext1.getInitParameter(name);
                out.print(name+"="+value+"
"); ​           } ​
//获取路径(这里应该是相对的)
getContextPath()
//获取从绝对路径
getRealPath()
​
​
//打印日志
log("message")
/*message会在Using CATALINA_BASE:   "C:\Users\lx\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d2c2fc4b-55e9-4c55-aa7a-c5f51a54a660"路径下的logs文件夹里生成文件存放message;*/
​
//servletContext对象还有另外一个名字:应用域(后面还有其他域,请求域,会话域)
​
//如果所有的用户共享一份数据,并且这份数据很少被修改,并且数据量很少,可以将这些数据放到ServletContext应用域中
//存(如何向ServletContext应用域中存数据)
public void setAttribute(String name,Object value)
//取(如何向ServletContext应用域中取数据)
public Object getAttribute(String name)
//删(如何向ServletContext应用域中删除数据)
public void removeAttribute(String name)

3.6注

以后写的Servlet类的时候,实际不会直接继承GenericServlet类,因为是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范中,提供了一个类叫HttpServlet,这是专门为HTTP协议准备的Servlet类,这个HttpServelt继承了GenericServlet类

 

4.HTTP协议

HTTP的请求协议(B->S)

HTTP的请求协议包括4部分

  • 请求行

  • 请求头

  • 空白行

  • 请求体

    具体报文get

    GET /servlet04/get?username=java&password=123 HTTP/1.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    Accept-Encoding: gzip, deflate, br, zstd
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
    Connection: keep-alive
    Host: localhost:8080
    Referer: http://localhost:8080/servlet04/
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: same-origin
    Sec-Fetch-User: ?1
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
    sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"                       

    具体报文post

                POST /servlet04/post HTTP/1.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    Accept-Encoding: gzip, deflate, br, zstd
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
    Cache-Control: max-age=0
    Connection: keep-alive
    Content-Length: 29
    Content-Type: application/x-www-form-urlencoded
    Host: localhost:8080
    Origin: http://localhost:8080
    Referer: http://localhost:8080/servlet04/
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: same-origin
    Sec-Fetch-User: ?1
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
    sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"                       

    URL和URI

    URL:统一资源定位符。代表网络中某个资源

    URI: 统一资源标识符。代表网络中某个资源的名字

    URL包括URI

  • get请求和post请求的区别

    • get请求发送数据的时候,数据会挂载到URI后面,并且在URI后添加?,?后面是数据,这样导致发送的数据回显在浏览器的地址栏中

    • post请求发送数据的时候,在请求体中发送,不会回显到地址栏中

    • get只能发送普通的字符串,并且发送的字符串有长度限制(无法发送大数据量)

    • post请求可以发送任何类型的数据量

    • get比较适合从服务端获取数据

    • post比较适合向服务端传送数据

    • get请求比较安全,只是从服务器获取数据,不会对服务器造成威胁

    • post请求比较危险,post是向服务器提交数据,如果这些数据通过后面被拦截

    • get请求支持缓存

    • post请求不支持缓存

  • 如何选择 get和post请求

    • 向服务器提交数据用post请求,form表单基本上都是post,如果表单中有敏感信息,还是建议用post,因为get会回显,文件上传用post

    • 其他情况用get

HTTP的响应协议(S->B)

HTTP的响应协议

  • 状态行

  • 响应头

  • 空白体

  • 响应体

    具体报文

    HTTP/1.1 200                            //状态行
    Content-Type: text/html;charset=UTF-8       响应头
    Content-Length: 144
    Date: Mon, 09 Dec 2024 13:42:40 GMT
    Keep-Alive: timeout=20
    Connection: keep-alive
    ​
                                                    空白行
                 
                                             响应体
    
        
        from get servlet
    
    
        

    from get servlet

    状态行:第一部分(版本协议号)

    第二部分状态码(不同的状态码对应不同的响应结果)

    如200表示响应·成功

    404表示访问资源不存在,通常是路径写错了或者是服务器中对应资源没有启动成功

    405表示前端发送的请求方式与后端的请求处理方式不同,如前端是post请求,后端按照get方式处理或者是

前端是get请求,后端按照post方式处理;

500:服务器的程序异常

响应头:响应的内容类型,响应的内容长度,响应的时间

 

 

 

 

4.1HttpServlet源码

 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_get_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }
    
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_post_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
   }
//这两个是httpServlet中的方法,当有get或者是post请求时,去执行相应的方法,如果子类没有重写这相应的方法,而且发生了相应的请求,则报405错误
​
​
//就是若执行父类的doget或者dopost方法则报错

4.2设置webapp欢迎页

1.首先编写 login.html(或者servlet也可以)

2.添加项目依赖

3.在web.xml中添加


        login.html
 

4.3 Request常用方法

Map parameterMap =request.getParameterMap();
Enumeration name =request.getParameterNames();
String Values= request.getParameterValues("name");
String values=request.getParameter("name");

请求域对象的三个方法

  • void setAttribute(String name, Object obj);//向域中绑定数据
    Object getAttribute(String name);//从域中根据name获取数据
    void removeAttribute(String name);//将域中的绑定数据移除

转发器

  • Request.getRequestDispatcher("路径(不含项目名)").forword(request,response)
    

4.4转发和重定向

转发的代码

request.getRequestDispatcher("路径(不含项目名)").forword(request,response)

重定向的代码

 response.sendRedirect("这个路径要包含项目名+/b");
  • 转发是一次请求,两个页面之间转发,共享一个request,response,所以当两页面需要用同一组数据用转法否则用重定向,大多数还是用重定向

  • 而重定向是两次请求,当servlet1 重写了doget,而servlet2重写了dopost。这时使用转发会报405错误,而重定向则不会

 

 

 

5.jsp

5.1jsp是什么?

jsp(Java servlet page) 其实就是一个servlet ,编写的jsp,服务器将jsp文件生成java文件,编译成class文件。

5.2基本语法

1.<%   ???   %>   //这个里面可以编写java代码,写的代码加载到service方法中
2.注释<%--   ???  --%>
3.<%!  ???   %>    //这里面写的java代码加载到类体里(基本不用)
4.jsp 输出语句
<%
out.write("name=" +name);
%>
jsp内置九大内置对象out  
​
5.<%=  ???   %>这里编写的代码加到service中,翻译成out.print(???);
一般用输出变量是
6<%@ page contentType="text/html;charset=UTF-8" language="java" %> 配置文件

编写的代码在C:\Users\lx\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d2c2fc4b-55e9-4c55-aa7a-c5f51a54a660\work\Catalina\localhost\jsp\org\apache\jsp

这个位置生成了java文件,并编译了class文件

 

 

5.3jsp九大内置对象

jakarta.servlet.jsp.PageContext pageContext

jakarta.servlet.http.HttpServletRequest request

jakarta.servlet.http.HttpSession session

jakarta.servlet.ServletContext application

 

jakarta.servlet.jsp.JspWriter out

jakarta.servlet.http.HttpServletResponse response

 

 

jakarta.servlet.ServletConfig config

java.lang.Object page

Exception

5.4jsp指令

<% @ 指令名 属性名=“属性值”%>

  • page指令常见属性:

import="{package.class | package.*}, ..."

session="true | false"

errorPage="relative_url"

isErrorPage="true | false"

contentType="mimeType ;charset=characterSet " | "text/html ; charset=ISO-8859-1"

pageEncoding="characterSet | ISO-8859-1"

isELIgnored="true | false"

  • include指令 静态包含

  • taglib指令

    JSP支持标签技术,要使用标签技术就先得声明标签库和标签前缀。taglib指令就是用来指明JSP页面内使用标签库技术

6.关于B/S结构系统的会话机制(session)

6.1session对象作用

主要是保存会话状态(用户登录成功算一次会话状态)一次会话包含多次请求

一次会话对应一个session对象(关闭浏览器算一次会话)

6.2为什么不用request或ServletContext?

request生命周期太短

而ServletContext域太大,而且是多个用户共享一个ServletContext对象

6.3session实现原理

在web服务器中有一个session列表,类似于map集合,这个map集合的key存储的是sessionid(以Cookie的形式保存的,浏览器关闭cookie就消失了 ),这个map集合的value存储的对应是session对象

 

用户发送第一次请求,服务器生成session对象同时给session对象生成一个sessionid

,并且给这个sessionid发送给浏览器,浏览器将id存放到缓存中

 

用户发送第二次请求,将浏览器中的缓存中的sessionid自动发给服务器,服务器根据sessionid找到对应的session对象

 

注:cookie禁用之后,每次访问都是新的session对象,要想使用就使用URL重写机制

6.4使用

HttpSession hs= request.getSession();
//用户访问session对象,没有则在服务生成session对象及sessionid
HttpSession hs= request.getSession(false);
//这种是直接访问,没有则返回null
​
​
  session.invalidate();//销毁session
//这仨方法和ServletContext,,request使用方法一样
session.setAttribute();
session.getAttribute();
session.removeAttribute();

7.Cookie

  • session的实现原理中每一个session对象对应一个sessionid

    • JSESSIONID=3D53D6E5AA202281A0A6F14C48278B60

    • 这个键值对就是一个Cookie对象

    • 只要浏览器不关闭,用户再次发送请求,会自动将运行内存中的cookie发给服务器

  • Cookie作用

    • 和session一样都是为了保存会话状态

    • cookie将会话状态保存到浏览器客户端

    • session将会话状态保存到服务器端

  • 使用方法

      Cookie cookie=new Cookie(name,value);//创建一个cookie对象
    ​
    - setMaxAge(),设置cookie有效期
      - 0,表示删除同名cookie
      - 大于0,表示cookie存储到硬盘中
      - 小于0,表示cookie存储到浏览器内存中
    setPath(request.getContextPath());//设置路径,及在这个路径和其子路径都会生成cookie
    - response.add(cookie) 
    request.getCookie();
    getname(),getvalue();

     

    8.EL表达式

    • EL(Expression Language)表达语言

    • EL表达式可以代替jsp中的java代码,让jsp文件中的程序看起来更美观

    • 主要作用

      • 从作用域中取数据,然后将其转字符串,然后将其输出到浏览器

使用

<%@ page import="org.scidag.jsp.bean.User" %>
<%@page contentType="text/html; charset=UTF-8" %>
​
 //体验EL表达式,最基本的
<% ​    request.setAttribute("name","zhangsan"); ​     User user=new User();     user.setAge(18);     user.setName("li");     user.setSex(false);     request.setAttribute("user",user); %> ${name}
${user} ${user.age}<--这里其实就是取调用了user的getAge()方法--> ${user.name} ${user.sex}
${user["sex"]} ${user["age"]} ${user["name"]} ​
  • 在四个域中,如果名字相同,则优先去小的域取数据

可以使用这四个名称指定域

PageScope

RequestScope

SessionScope

ApplicationScope

使用“\${user}“,可以忽略EL表达式
  • 通过EL表达式获取应用的根

    ${pagecontext.request.contextPath}

  • JSP中EL表达式的隐式对象

    • pagecontext

    • param

    • paramValues

    • initParam

    • .....

  • EL表达式的运算符

    • 算数运算符 + - * / %

    • 关系 ==

    • 逻辑

    • 条件

    • 取值 . []

    • empty (判断是否为空,为空则是true)

9.JSTL标签库

java standard tab lib

  • java标准的标签库

  • 通常和EL表达式一起使用,为了让jsp文件中的java代码消失

  • 使用步骤

    • 引入jar包

    • page引入标签库<% @taglib prefix="" uri ="urI"%>

  • 常用的标签(core核心标签库)

    • foreach

    • if

    • choose

      相当于if

      else if

      else

     

 

你可能感兴趣的:(java,java-ee,servlet,笔记,学习,数据库)