这周开始了Java Web的学习。
安装TomCat服务器
https://blog.csdn.net/angel_w/article/details/78580528
配置tomcat服务器
ieda中的配置
- 右键项目,新建一个module。选择Java EE中的Web Application,设置项目名称后新建了一个JavaWeb项目。
- 将TomCat服务器配置到idea中:Run -> Edit Condigurations -> “+” ->TomCat Server -> Local -> Deployment -> “+” -> Artifat -> ok
- 在上方下拉菜单选择TomCat->Run 即可启动TomCat服务器
Java Web
Java Web开发的目录结构
Servlet
Servlet概述
Servlet是和平台无关的服务端组件,运行在Servlet容器中。
Servlet容器负责Servlet和客户端之间的通信以及调用Servlet的方法。
Servlet可完成的功能:
- 创建、返回基于客户端请求的动态HTML页面
- 与其他服务器资源进行通信
Servlet生命周期方法,这些方法都是由Servlet容器负责调用:
- Public void init(ServletConfig servletConfig);
只被调用一次,在第一次请求Servlet之后,Servlet容器调用Servlet的构造方法(一般不需要实现)然后就会调用init方法初始化当前Servlet - Public void service(ServletRequest servletRequest,ServletRespon seservletResponse);
会被多次调用,每次请求都会调用Servlet方法,用于响应请求 - Public void destroy();
只被调用一次,在当前Servlet所在的Web应用被卸载前带哦用,用于销毁当前Servlet对象,释放空间
创建一个Servlet程序的步骤:
- 实现Servlet接口
- 根据所需功能实现其内部的方法
- 在web.xml中进行Servlet的注册
web.xml中Servlet的注册
<servlet>
<servlet-name>Servlet的注册名</servlet-name>
<servlet-class>Servlet类的完整类名(src.hello)</servlet-class>
<load-on-startup>int(Servlet按照这个int的从小到大顺序进行加载,若为负数,则在第一次获取到请求时进行加载)</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Servlet的注册名</servlet-name>
<url-pattern>调用该Servlet的url(/。。。斜杠表示根目录)</url-pattern>
<!-- 多个servlet-mapping的servlet-name可以相同,也就是一个Servlet可以拥有多个servlet-mapping配置 -->
<!-- 可以使用通配符(*),例如:使用*.html 表示所有以“.html”结尾的URL(*不能同时前面加/ 后面加拓展名) -->
</servlet-mapping>
ServletConfig对象
封装了Serlvet的配置信息,可以获取ServletContext对象
配置Servlet的初始化参数:
<!-- 这个节点需要放在servlet节点中,并在load-on-startup节点之前 -->
<!-- 这个例子传入了名为user的参数,值为root,在连接数据库时可以使用 -->
<init-param>
<!--参数名-->
<param-name>user</param-name>
<!--参数值-->
<param-value>root</param-value>
</init-param>
获取初始化参数:
- getInitParameter(String name);获取指定参数名的初始化参数
- getInitParameterNames();获取由所有参数名组成的Enumeration对象
ServletConfig接口的方法:
- getInitParameterNames
- getInitParameter
- getServletName
- getServletContext
ServletContext对象
Servlet引擎为每个Web应用程序都创建一个对应的ServletContext对象。
ServletContext对象被包含在ServletConfig对象中。通过调用ServletConfig.getServletContext()方法返回得到ServletConfig对象的引用。
每一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象被称之为Web应用程序对象。
功能:
- 获取Web应用程序的初始化参数
- 记录日志
- application域范围的属性
- 访问资源文件
- 获取虚拟路径所映射的本地路径
- Web应用程序之间的访问
- ServletContext的其他方法
1.获取ServletContext对象
ServletContext servletContext = servletConfig.getServletContext();
2.获取当前Web应用程序的初始化参数,方法和使用ServletConfig类是相同的,只不过使用ServletContext对象查询得到的是作用于整的Web应用程序的全局初始化参数
servletContext.getInitParameter(“jdbcDriver”);
3.获取某个文件在服务器上的绝对路径
servletContext.getRealPath(“helloServlet.java”);
4.获取Web应用程序的名称
servletContext.getContextPath();
5.获取每一个文件对应的输入流,相当于创建输入流
servletContext.getResourceAsStream("/WEB-INF/web.xml");
HTTP协议
Web浏览器与Web服务器之间一问一答的交互过程必须遵循一定的规则,即HTTP协议。
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于定于Web浏览器与Web服务器之间交换数据的过程以及数据本身的格式。
HTTP的会话方式:
- 客户端向服务器建立链接
- 客户端发送请求信息
- 服务器回送响应信息
- 服务器关闭连接
浏览器与Web服务器的连接过程是短暂的,每次连接至处理一个请求和响应。
每一个页面的访问都需要建立一次单独的连接。
浏览器和Web服务器之间的所有通讯之间都是完全相互独立分开的。
HTTP请求消息:
请求消息结构:
一个请求行、若干消息头、实体内容。
HTTP响应消息:
响应消息结构:
一个状态行,若干消息头、实体内容。
GET和POST请求:
- GET请求的内容使用?连接在URL后,内容之间使用&连接。
传送的数据有限,通常1kb以下。 - POST请求的内容包含在HTTP请求中。
ServletRequest对象
servletRequest封装了请求信息
servletResponse封装了响应信息
这两个接口的实现类都是服务器给予实现的,并由服务器在调用Servicet方法时传入。
获取请求参数:
- String getParameter(String name);
根据请求的名字获取到参数值 - Map getParameterMap();
获取以参数名和参数值为键值对的Map - Enumeration getParameterNames();
获取保存了所有参数名的Enumeration对象 - String[] getParameterValues(String name);
获取某一个请求的多个值(如checkbox多选)
获取请求的URI/URL:
需要先进行类型转换
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
httpServletRequest.getRequestURI()
如何接受一个请求:
- 在HTML文件中,表单中设置该请求的url
- 编写相应的Servlet,实现其中的Service方法去处理该请求
- 使用servletRequest获取请求
- 对请求进行处理
- 在Web.html中对编写好的Servlet进行注册,注册的url为/+html中的url
ServletResponse对象
servletRequest封装了请求信息
servletResponse封装了响应信息
这两个接口的实现类都是服务器给予实现的,并由服务器在调用Servicet方法时传入。
常用方法:
- PrintWriter servletResponse.getWriter();
向浏览器中打印文字 - servletResponse.setContentType(“application/msword”);
设置相应的内容类型(这里修改成了word文档) - void sendRedirect(String location);
请求的重定向(需要转型为http。。。。。)
GenericServlet抽象类
实现了Servlet接口和ServletConfig接口,简化开发。
是一个抽象类,其中service()方法为抽象方法。
具体实现:
- 在GenericServlet中声明一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行初始化。
- 利用ServletConfig成员变量完成ServletConfig接口的实现。
- 还定义了一个init()方法,在init(ServletConfig)中对其进行调用,子类直接覆盖init()对Servlet进行初始化,原先的init(ServletConfig)由Servlet容器进行调用时会执行其中的init()进行初始化。
HttpServlet对象
- 针对于HTTP协议定义的一个Servlet类,继承自GenericServlet。
- 在service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse并调用了重载的service(HttpServletRequest,HttpServletResponse)
- 定义了doXxxx();(doGet()or doPost())方法,实际开发中,根据请求的方式直接覆盖相应的方法即可。并不需要覆盖service(HttpServletRequest,HttpServletResponse)方法,在定义好的service(HttpServletRequest,HttpServletResponse)方法中通过判断method然后调用相应的doGeet()或doPost()。
好处:
- 不需要考虑请求方式,因为直接使用相应方法即可。
- 不需要进行强行转换
JSP
JSP概述
- JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码编写,固定不变的内容则使用普通静态HTML页面的方式编写
- JSP页面中的Java代码放在body节点中的<% %>中
- JSP页面可以放置在Web应用程序除WEB-INF之外的其他任何目录中。
- JSP的运行原理:
- JSP本质上是一个Servlet
- Web容器接收到以.jsp为拓展名的URL访问需求时,将该访问需求交给JSP引擎其处理。
- 每个JSP页面第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着把这个Servlet源程序编译成Servlet的class类文件,然后再由Web容器像调用普通Servlet程序一样来装载和解释执行这个由JSP页面翻译而成的Java Servlet程序。
- 可以在Web应用程序发布之前,将其中所有的JSP页面于线编译成Servlet程序。
JSP隐式对象
在JSP文件中的<% %>中,可以直接使用(不需要声明)reqiest,response,pageContext,session,application,config,out,page着八个对象,实际上还可以使用一个叫exception的隐含对象。
- reqiest,即HttpServletReqiest
- response,即HttpServletResponse(在JSP页面中几乎不会使用)
- pageContext,页面的上下文,可以从来对象中获取其他的八个隐含对象,也可以从中获取当前页面的其他信息
- session,指的是客户端和服务器的一次会话
- application,代表当前的应用,即ServletContext对象
- config,当前JSP页面所对应的Servlet的ServletConfig对象(几乎不使用),如果访问当前JSP配置的初始化参数,则需要通过映射的地址out,JspWriter对象,调用out.println()方法可以直接向浏览器输出
- page,指向当前JSP对应的Servlet对象 的引用,但为Object类型,只能调用Object类的方法(几乎不使用)
- exception,在声明了page指令的isErrorPage=“true”时才可以使用,用于错误处理
在web.xml文件的配置中,servlet中使用jsp-file进行设置文件,需要在路径前加/代表根目录
JSP指令
JSP指令的作用时为当前页面做一些基本的属性设置,为当前页面的运行提供基本的环境。
根据功能不同,JSP中包含三类指令:page指令(页面指令)、include指令(包含指令)和taglib指令(标签库指令)。
使用语法格式如下:
<%@ 指令名称 属性名=属性值 属性名=属性值 属性名=属性值 。。。。 %>
page指令:
page指令用于设置当前JSP页面的相关信息。一个JSP文件中可以包含多个page指令,常见的page指令的属性以意及用法如下:
- pageEncoding属性
用于设置当前页面的编码,默认相应的文本为text/html - contentType属性
功能上和pageEncoding一样,没有默认的文本 - import属性
用于导入JSP页面中Java代码所使用的类 - errorPage属性
设置JSP中的java代码报错之后的跳转页面 - isErrorPage属性
默认为false,修改为true将当前页面设置为错误处理页面 - session属性
阻止 JSP 页面为那些尚不拥有会话的用户创建新的会话
include指令:
<%@ include file="文件的绝对路径或相对路径"%>
效果为引入不同格式的文件。
静态联编:在编译之前,就已经把include引入的文件加入到代码中。
在静态联编引入的文件中,变量可以共享,所以两文件中不可以定义同名的变量
JSP动作
在JSP页面中大量使用Java代码块、表达式等内容,会使JSP页面非常乱。为了使页面变的简洁明了,尽量少的使用Java代码块和表达式,取而代之的使EL表达式、JSTL标签,以及JSP动作。
JSP动作是指使用系统定义好的标签来完成Java代码完成的功能。
语法格式:
<jsp:动作名称 属性名=属性值 属性名=属性值 。。。></jsp:动作名称>
或
<jsp:动作名称 属性名=属性值 属性名=属性值 。。。/>
JSP语法
JSP模板元素:
- 在JSP页面中的静态HTML内容称为JSP模板元素。
- JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
JSP表达式:
- 可以直接输出页面上的一个变量:<%= data %>
JSP脚本片断:
- 指嵌套在<%和%>之中的一条或多条Java程序代码
- JSP脚本片断中的Java代码将被原封不动地搬进由JSP页面所编译成地Servlet地jspServlet方法中。
- 一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断中可以嵌入文本、HTML标签和其他JSP元素
- 多个脚本片断中地代码可以相互访问
- JSP脚本片断中的Java代码必须严格遵循Java语法,如:分号等
JSP声明:
- JSP声明将Java代码封装在<%! 和 %>中,这里面地代码将被插入进Servlet地jspServlet方法外面,所以JSP声明可用于定义JSP页面转换成地Servlet程序的静态代码块、成员变量和方法。
- 多个静态代码块、成员变量和方法可以定义在一个JSP声明中,也可以分开写。
- JSP隐式对象的作用范围仅限于Servlet的jspServlet方法,所以在JSP声明中不可以出现这些隐式对象。
JSP注释:
- <%-- --%>中书写注释
与属性相关的方法
- 方法:
- Object getAttribute(String name);获取指定的属性
- Enumeration getAttributeNames();获取所有属性名字组成的Enumeration对象
- boolean removeAttribute(String name);移除属性
- void setAttribute(String name,Object o);设置属性
- pageContext、request、session、application对象都有这些方法,这四个对象也称之为域对象
- pageContext属性的作用域仅限于当前JSP页面
- request属性的作用域仅限于同一个请求
- Session属性的作用域仅限于一次会话:浏览器打开直到关闭称之为一次会话
- application属性的作用域仅限于当前Web应用,是范围最大的属性
请求转发和重定向
请求转发
- 请求转发的操作流程
- 调用HTTPServletRequest的getRequestDispatcher(“请求转发地址”)方法,获取RequestDispatcher对象。
- 调用RequestDispatcher的forward(request,response)进行请求的转发。
servletRequest.getRequestDispatcher("/url").forward(servletRequest,servletResponse);
- 请求转发的运行流程
- 客户端向服务器发送请求。
- 服务器接受请求并进行执行。
- 服务器将请求转向另一个URL,并执行。
- 服务器将另一个URL的响应反馈给客户端。
-
请求的重定向
- 用sendRedirect方法实现请求重定向
httpServletResponse.sendRedirect("/world"); - 请求重定向的运行流程
- 客户端向服务器发送请求。
- 服务器接受请求并返回给客户端一个响应,响应的内容是让客户端取访问另一个URL。
- 客户端向新得到的URL发起请求。
- 新的URL的服务器接受请求并将响应发送回客户端。
- 用sendRedirect方法实现请求重定向
-
请求重定向与请求转发的比较
- 请求的转发只需要客户端发送一次请求,而重定向需要客户端向新的URL再发送一次请求。
- 请求的转发不会改变网页的地址,而重定向会。
- 请求的转发因为只进行了一次请求的发送,所以效率较请求重定向较高。
- 请求的转发因为是在服务器自己执行获取了另一个URL的的响应,所以必须再服务器内部进行转发,而重定向因为是告诉客户端重新发送请求,所以可以进行服务器外部的跨域访问。