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](https://gitee.com//xizhongren8980/BlogImages/raw/master/imgs/20201113105448.png)
3 创建JavaWeb项目
配置classes和lib文件夹:
classes文件夹存放编译输出的字节码文件,lib存放jar包依赖。
- 创建classes和lib文件夹
![image-20201113123347121](https://gitee.com//xizhongren8980/BlogImages/raw/master/imgs/20201113123354.png)
-
配置classes文件夹
-
配置lib文件夹
然后找到lib文件夹,再选择 Jar Directory ,最后点击OK即可。
配置完成后的样子:
![image-20201113124338021](https://gitee.com//xizhongren8980/BlogImages/raw/master/imgs/20201113124341.png)
下图的设置可以省略项目名即可进行访问。即 http://localhost:8080/index.jsp
也能访问。
![image-20201113130937975](https://gitee.com//xizhongren8980/BlogImages/raw/master/imgs/20201113130946.png)
4 Tomcat管理项目
tomcat启动的时候会加载webapps下的所有项目,所以在拥有多个项目时,启动会变得越来越慢。
在tomcat-users.xml中添加管理用户:
<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>
启动tomcat然后点击红色框登录后就能进行项目管理:
二 Servlet
Servlet(Server Applet) 是用Java语言编写的服务端程序,主要功能就是交互式地浏览和修改数据,生成动态的Web内容,广义的Servlet是指任何实现了Serlvet接口的类。
1 servlet API
![servlet](https://gitee.com//xizhongren8980/BlogImages/raw/master/imgs/20201113155923.png)
2 创建第一个servlet
-
创建一个类实现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("销毁方法执行了"); } }
-
在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>
-
请求执行顺序
当项目启动后,程序是先加载web.xml配置文件,从而得到请求名和 对应处理请求的完整路径 ;
当用户进行请求访问时,程序会匹配配置文件中的
<url-pattern>
标签的请求名,如果匹配成功,则相当于得到<servlet-name>
里面的值,然后再到<servlet>
标签里面查找相同值的标签从而得到对应<servlet-class>
标签里面的内容,即 类的完整路径,进而再通过反射机制得到处理请求类对象,最后自动调用该对象里面的service()
方法来处理逻辑业务。
补充:
-
Servlet3.0后还支持注解配置Servlet方式
@WebServlet常用属性
属性 类型 说明 是否必须 asynSupported boolean 指定Servlet是否支持异步操作模式 否 displayName String 指定Servlet显示名称 否 initParams webInitParam[] 配置初始化参数 否 loadStartUp int Servlet加载时机 否 name String 指定Servlet名称 否 urlPatterns/value String[] 两种写法都可,指定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工作原理
- Servlet接口定义了Servlet与servlet容器(管理Servlet实现类)之间的契约:即Servlet容器将Servlet实现类加载到内存,并产生实例和调用它具体的方法,并且在一个应用程序中,每个Servlet类只有一个实例,即是单例的。
- 用户请求会使得Servlet容器自动调用Servlet类中的
service()
方法,并且会传入一个 ServletRequest 和 ServletResponse 对象,这个两个对象都是由Servlet容器封装好的,不需要程序员实现,可以直接使用。 - ServletRequest 对象封装了当前的 HTTP 请求,开发人员不需要解析和操作原始数据。ServletResponse表示当前用户的 HTTP 响应,程序员只需要直接操作 ServletResponse 对象就能把响应发回给用户。
- 对于每一个应用程序,Servlet容器还会创建一个ServletContext对象,该对象封装了上下文(应用程序)的环境详情,每个应用程序只有一个ServletContext,每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
4 Servlet声明周期
- 当客户端发送第一次请求,由容器进行解析,根据请求找到对应的Servlet类,并且判断该类实例是否存在,如果不存在则进行实例的创建(第二次请求时,会判断对象实例是否存在,但是不会执行
init()
方法); - 创建实例之后,会调取实例的
init()
方法进行初始化的操作; - 初始化操作完成之后,继续调用
service()
进行处理业务; - 服务器关闭时会执行
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 客户端向服务器提交数据
-
通过form表单提交(get/post)
-
通过a标签提交 (get方式)
<a href="请求名?key1=value1&key2=value2..."> <a href="/login?username=admin&password=123456">
-
通过地址栏拼接字符串(get方式)
-
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九大内置对象
-
request
在request中存储的值只在当前请求中有效
request.setAttribute(key,value); request.getAttribute(key,value);
-
response
代表对客户端的响应,主要将JSP容器处理过的对象传回客户端。
-
session
一个session会话可以包含多个请求,所以存的值保存时间可以更久,范围也更广,存在于浏览器访问期间。
session.setAttribute(key,value); session.getAttribute(key,value);
-
application
此对象可将信息保存到服务器,直到服务器关闭,所有数据可以跨浏览器
-
out
用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
-
pageContext
它可以取得任何范围的参数,如out、request、response、session、application等对象。它的创建和初始化都是由容器来完成,在JSP页面可以直接使用该对象。
-
config
主要用于获取服务器的配置信息,通过 pageContext对象的getServletConfig()方法可以获取一个config对象。
-
page
该对象代表JSP页面本身,只有在JSP页面内才是合法的,page隐含对象本质上包含当前Servlet接口引用的变量,类似于Java中的this指针。
-
exception
该对象的作用是显示异常信息,只有在包含isErrorPage="true"的页面中才可以使用,在一般的JSP页面中使用该对象将无法编译JSP文件,exception对象定义了许多的异常情况。
JSP作用域:pageContext<request<session<application
2 JSP指令
-
page
定义网页依赖属性,比如脚本语言、error页面、缓存需求等
page指令为容器提供当前页面的使用说明 一个JSP页面可以包含多个page指令
格式:<%@page attribute="value"%>
-
include
用于包含其他页面,被包含的页面可以是JSP文件,HTML文件或者文本文件,包含的文件会随着JSP页面的编译一同被编译。
格式:<%@ include file="文件相对url地址"%>
-
taglib
引入标签库的定义
格式:<%@ taglib uri="uri" prefix="" %> uri确定标签库的位置,prefix指定标签库的前缀(可自定义)
3 JSP出现的状态码
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编程步骤:
- 创建XMLHttpRequest对象
- 设置请求方式
- 调用回调函数
- 发送请求
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");