JavaWeb之JSP、Tomcat、Servlet和Ajax简述

JavaWeb学习记录

一 tomcat

1 tomcat目录结构
  • bin

    bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。

    很多环境变量的设置都在此处,例如可以设置JDK路径、tomcat路径
    startup 用来启动tomcat
    shutdown 用来关闭tomcat
    修改catalina可以设置tomcat的内存

  • conf

    conf目录主要是用来存放tomcat的一些配置文件。

    server.xml可以设置端口号设置域名或IP、默认加载的项目请求编码
    web.xml可以设置tomcat支持的文件类型
    context.xml可以用来配置数据源之类的
    tomcat-users.xml用来配置管理tomcat的用户与权限
    在Catalina目录下可以设置默认加载的项目

  • lib

    lib目录主要用来存放tomcat运行需要加载的jar包。

  • logs

    logs目录用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出的日志。(清空不会对tomcat运行带来影响)
    在windows环境中,控制台的输出日志在catalina.xxxx-xx-xx.log文件中
    在linux环境中,控制台的输出日志在catalina.out文件中

  • temp

    temp目录用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响)

  • webapps

    webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。

  • work

    work目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。
    清空work目录,然后重启tomcat,可以达到清除缓存的作用。

2 IDEA中配置tomcat
image-20201113105438507
3 创建JavaWeb项目

image-20201113122923698

配置classes和lib文件夹:

classes文件夹存放编译输出的字节码文件,lib存放jar包依赖。

  • 创建classes和lib文件夹
image-20201113123347121
  • 配置classes文件夹

    image-20201113123807570
  • 配置lib文件夹

    image-20201113124023970

    然后找到lib文件夹,再选择 Jar Directory ,最后点击OK即可。

    image-20201113124113704

配置完成后的样子

image-20201113124338021

下图的设置可以省略项目名即可进行访问。即 http://localhost:8080/index.jsp也能访问。

image-20201113130937975
4 Tomcat管理项目

tomcat启动的时候会加载webapps下的所有项目,所以在拥有多个项目时,启动会变得越来越慢。

在tomcat-users.xml中添加管理用户:

image-20201113133437137

<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>

启动tomcat然后点击红色框登录后就能进行项目管理:

image-20201113133751051

image-20201113133734500

二 Servlet

Servlet(Server Applet) 是用Java语言编写的服务端程序,主要功能就是交互式地浏览和修改数据,生成动态的Web内容,广义的Servlet是指任何实现了Serlvet接口的类。

1 servlet API
servlet
2 创建第一个servlet
  1. 创建一个类实现Servlet接口,或者继承HttpServlet

    public class ServletDemo1 implements Servlet {
        //该方法只在第一次请求访问时执行
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("初始化方法执行了");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    	//默认调用该方法进行处理业务逻辑
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("业务逻辑方法执行了");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    	//该方法在项目停止运行后执行,关闭浏览器不会执行
        @Override
        public void destroy() {
            System.out.println("销毁方法执行了");
        }
    }
    
  2. 在web.xml配置文件中配置Servlet的映射关系

    模板如下:

    <servlet>
    	<servlet-name>自定义名称</servlet-name>
    	<servlet-class>处理请求的类的完整路径</servlet-class>
    </servlet>
    <servlet-mapping>
    	<servlet-name>自定义名称</servlet-name>
    	<url-pattern>请求名</url-pattern>
    </servlet-mapping>
    

    例如在一个页面中添加一个标签

    <a href="/tologin">登录</a>
    

    在web.xml中配置如下:

        <servlet>
            <servlet-name>aaa</servlet-name>
            <servlet-class>com.xizhongren.web.ServletDemo1</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>aaa</servlet-name>
            <url-pattern>/tologin</url-pattern>
        </servlet-mapping>
    
  3. 请求执行顺序

    当项目启动后,程序是先加载web.xml配置文件,从而得到请求名对应处理请求的完整路径

    当用户进行请求访问时,程序会匹配配置文件中的 <url-pattern> 标签的请求名,如果匹配成功,则相当于得到 <servlet-name> 里面的值,然后再到 <servlet> 标签里面查找相同值的标签从而得到对应 <servlet-class> 标签里面的内容,即 类的完整路径,进而再通过反射机制得到处理请求类对象,最后自动调用该对象里面的 service() 方法来处理逻辑业务。

补充:

  • Servlet3.0后还支持注解配置Servlet方式

    @WebServlet常用属性

    属性类型说明是否必须
    asynSupportedboolean指定Servlet是否支持异步操作模式
    displayNameString指定Servlet显示名称
    initParamswebInitParam[]配置初始化参数
    loadStartUpintServlet加载时机
    nameString指定Servlet名称
    urlPatterns/valueString[]两种写法都可,指定Servlet处理的url
    @WebServlet(name="myServlet",
    			urlPatterns="/uer/test",
    			loadOnStartUp=1,
    			initParams={
    				@WebInitParam=(name="username",value="小明"),
    				@WebInitParam=(name="password",value="123321")
    			}
                )
    public class ServletDemo1 implements Servlet {
       //省略代码
    }
    
    name属性:可以指定也可以不指定,可以通过 getServletName() 获取到,若不指定,则为Servlet的完整类名,
    例如com.xzr.servlet.ServletDemo1
    
    loadOnStartUp属性:标记容器是否在启动应用时就加载Servlet,默认不配置或者数值为负数时表示客户端第一次
    请求Servlet时再对其进行加载;在数值为正数的情况下,该数值越小,加载的优先级就越高
    
    urlPatterns/value属性:参数是String[] 类型的,可以配置多个映射,多个映射写法{"映射1","映射2",...}
    
    urlPatterns的常用规则:
    /*或者/:拦截所有
    *.do:拦截指定后缀
    /user/test:拦截路径
    /user/.do、/.do、test*.do都是非法的,启动会报错
    
    在使用注解方式时,根元素中不能配置属性 metadata-complate="true"。该属性表示通知web容器是否扫描注解,默认为false表示
    扫描注解。如果不扫描注解,那么采用注解的方式配置的Servlet就不会生效
    
3 Servlet工作原理
  1. Servlet接口定义了Servlet与servlet容器(管理Servlet实现类)之间的契约:即Servlet容器将Servlet实现类加载到内存,并产生实例和调用它具体的方法,并且在一个应用程序中,每个Servlet类只有一个实例,即是单例的。
  2. 用户请求会使得Servlet容器自动调用Servlet类中的 service() 方法,并且会传入一个 ServletRequest 和 ServletResponse 对象,这个两个对象都是由Servlet容器封装好的,不需要程序员实现,可以直接使用。
  3. ServletRequest 对象封装了当前的 HTTP 请求,开发人员不需要解析和操作原始数据。ServletResponse表示当前用户的 HTTP 响应,程序员只需要直接操作 ServletResponse 对象就能把响应发回给用户。
  4. 对于每一个应用程序,Servlet容器还会创建一个ServletContext对象,该对象封装了上下文(应用程序)的环境详情,每个应用程序只有一个ServletContext,每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
4 Servlet声明周期
  1. 当客户端发送第一次请求,由容器进行解析,根据请求找到对应的Servlet类,并且判断该类实例是否存在,如果不存在则进行实例的创建(第二次请求时,会判断对象实例是否存在,但是不会执行 init() 方法);
  2. 创建实例之后,会调取实例的 init() 方法进行初始化的操作;
  3. 初始化操作完成之后,继续调用 service() 进行处理业务;
  4. 服务器关闭时会执行 destory() 方法进行对象销毁。
5 请求

HttpServletRequest 表示Http 环境中的 Servlet 请求,扩展于 ServletRequest 接口。

常用方法:

//根据表单组件名称获取提交的数据,返回值是String(服务器在接受数据时统一使用字符串进行接收)
String - getParameter(String name);

//获取表单组件中的对应的多个值的请求数据,例如一些复选框,返回的是一个字符串数组
String[] - getParameterValues(String name);

//指定请求的编码(针对post请求才有用),返回值是void,要在参数接收的前面进行设置才有效
void - setCharacterEncodeing(String charset);

//跳转页面,返回一个 RequestDispatcher 对象,还需要调用该对象的 forward(Request req, Response resp) 方法用于转发请求
RequestDispatcher - getRequestDispatcher(String path);

//存值
request.setAttribute("key",value);

//取值
request.getAttribute("key");

6 响应

HttpServletReponse接口,继承自ServeltResponse ,专门用来封装HTTP响应消息,在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头和响应消息体的方法。

常用方法:

void addCookie(Cookie c);		//给这个响应添加一个cookie

void sendRedirect(String s);	//发送一条响应码,将浏览器跳转到指定的位置

//获得响应字符流,通过字符流的Writer(String s)可以将字符串设置到response缓冲区中,
//随后由tomcat将其组装成http响应返回给浏览器端
PrintWriter getWriter();		

setContentType();				//设置响应内容的类型
7 客户端向服务器提交数据
  1. 通过form表单提交(get/post)

  2. 通过a标签提交 (get方式)

    <a href="请求名?key1=value1&key2=value2...">
    
    <a href="/login?username=admin&password=123456">
    
  3. 通过地址栏拼接字符串(get方式)

  4. js提交数据(get方式)

    location.href="目标请求?key1=value1&key2=value2"
    
8 get和post的区别
  • 在GET的请求方式中,URL采用ASCII编码,而不是Unicode编码,因此所有非ASCII字符都要编码之后再进行传输

  • get方式传输数据有限制,特定的浏览器和服务器对URL的长度有限制

  • 一般来说Post安全性更好

9 转发和重定向
  • 转发

    一次请求一次响应

    转发时地址栏显示的是请求页面的地址,requeset中的数据可以保存。

    request.getRequestDispatch("").forward(request, response);
    
  • 重定向

    客户端会请求两次服务器,第一次请求的是处理页面,然后由处理页面返回结果页面的名称;第二次再由客户端请求由处理页面返回的结果页面。

    形象理解就是张三向李四请教问题,李四说这个问题要由王二来处理,张三只好再重新向王二请教问题。

    重定向地址栏会改变,request中存储的数据会丢失

    response.sendRedirect("");
    

三 JSP

1 JSP九大内置对象
  1. request

    在request中存储的值只在当前请求中有效

    request.setAttribute(key,value);
    request.getAttribute(key,value);
    
  2. response

    代表对客户端的响应,主要将JSP容器处理过的对象传回客户端。

  3. session

    一个session会话可以包含多个请求,所以存的值保存时间可以更久,范围也更广,存在于浏览器访问期间。

    session.setAttribute(key,value);
    session.getAttribute(key,value);
    
  4. application

    此对象可将信息保存到服务器,直到服务器关闭,所有数据可以跨浏览器

  5. out

    用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

  6. pageContext

    它可以取得任何范围的参数,如out、request、response、session、application等对象。它的创建和初始化都是由容器来完成,在JSP页面可以直接使用该对象。

  7. config

    主要用于获取服务器的配置信息,通过 pageContext对象的getServletConfig()方法可以获取一个config对象。

  8. page

    该对象代表JSP页面本身,只有在JSP页面内才是合法的,page隐含对象本质上包含当前Servlet接口引用的变量,类似于Java中的this指针。

  9. exception

    该对象的作用是显示异常信息,只有在包含isErrorPage="true"的页面中才可以使用,在一般的JSP页面中使用该对象将无法编译JSP文件,exception对象定义了许多的异常情况。

JSP作用域:pageContext<request<session<application

2 JSP指令
  1. page

    定义网页依赖属性,比如脚本语言、error页面、缓存需求等

    page指令为容器提供当前页面的使用说明 一个JSP页面可以包含多个page指令

    格式:<%@page attribute="value"%>
    

    image-20201210142847022

  2. include

    用于包含其他页面,被包含的页面可以是JSP文件,HTML文件或者文本文件,包含的文件会随着JSP页面的编译一同被编译。

    格式:<%@ include file="文件相对url地址"%>
    
  3. taglib

    引入标签库的定义

    格式:<%@ taglib uri="uri" prefix="" %>
    
    uri确定标签库的位置,prefix指定标签库的前缀(可自定义)
    
3 JSP出现的状态码

image-20201210143326616

4 EL表达式

Expression Language表达式语言。 主要作用就是简化对象和变量的访问。

语法格式:${展示的信息的名字}

当表达式没有指定变量或者对象的范围时,容器会依次从小范围到大范围(pageContext->request->session->application)的作用域查找该变量或对象的值。

  • pageScope:获取当前页面的属性值
  • requestScope:获取请求范围的属性值
  • sessionScope:获取会话范围的属性值
  • applicationScope:获取程序范围的属性值

我们也可以指定获取某个作用域范围的值:例如${requestScope.key}

EL表达式中的操作符:

类型定义
算术型+、-、*、/(除)、mod(取模)
逻辑型and、&&、or、||、!、not
关系型==、eq、!=、<=、>=等
empty前缀操作符,用于判断一个值是否为null或者empty,如果是,则返回true
条件型A?B:C
5 JSTL标签库

它是一个JSP标签集合,封装了JSP应用的通用核心功能,其作用就是简化JSP页面编码。

四 Session和Cookie

Cookie数据保存在客户端,Session数据保存在服务器端。

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的 SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户 端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,来存取Session数据。这一过程,是 不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个 Cookie的文本文件中;而Session则会占用服务器资源。所以,尽量不要使用Session,而使用Cookies。但是我们 一般认为Cookie是不可靠的,Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以 引起很多的安全问题Session是可靠地。但是目前很多著名的站点也都用Cookie。

五 AJAX技术

Asynchronous JavaScript and XML 异步的JavaScript和XML。

它不是一个新的编程语言,只是使用现有标准的新方法。

包含的技术包括:

  • 使用CSS和XHTML来进行展示
  • 使用DOM模型来交互和动态显示
  • 使用XMLHttpRequest来和服务器进行异步通信
  • 使用JavaScript来绑定和调用

它的核心技术就是 XMLHttpRequest 。不同的浏览器创建XMLHttpRequest是有差别的,IE浏览器使用ActiveXObject ,而其他浏览器使用的是 XMLHttpRequest 的JavaScript内置对象

Ajax编程步骤:

  1. 创建XMLHttpRequest对象
  2. 设置请求方式
  3. 调用回调函数
  4. 发送请求

jQuery的Ajax操作

$.ajax({
	url:请求地址,
	type:"get|put|post|delete"(默认是get),
	data:请求参数(key:"value"),
	dataType:请求数据类型"html|text|json|xml|script|jsonp",
	success:function(data,dataTextStatus,jqxhr){},	//请求成功的回调函数
	error:function(jqxhr,textStatus,error){}		//请求失败的回调函数
})

//简单的写法(以Post方式为例)
$.post("url",{请求参数},function(){
	//回调函数
},"JSON");
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值