2019.4.28学习周报

这周开始了Java Web的学习。

安装TomCat服务器

https://blog.csdn.net/angel_w/article/details/78580528

配置tomcat服务器

ieda中的配置

  1. 右键项目,新建一个module。选择Java EE中的Web Application,设置项目名称后新建了一个JavaWeb项目。
  2. 将TomCat服务器配置到idea中:Run -> Edit Condigurations -> “+” ->TomCat Server -> Local -> Deployment -> “+” -> Artifat -> ok
  3. 在上方下拉菜单选择TomCat->Run 即可启动TomCat服务器

Java Web

Java Web开发的目录结构

Java Web开发的目录结构

Servlet

Servlet概述

Servlet是和平台无关的服务端组件,运行在Servlet容器中。
Servlet容器负责Servlet和客户端之间的通信以及调用Servlet的方法。

Servlet可完成的功能:

  1. 创建、返回基于客户端请求的动态HTML页面
  2. 与其他服务器资源进行通信

Servlet生命周期方法,这些方法都是由Servlet容器负责调用:

  1. Public void init(ServletConfig servletConfig);
    只被调用一次,在第一次请求Servlet之后,Servlet容器调用Servlet的构造方法(一般不需要实现)然后就会调用init方法初始化当前Servlet
  2. Public void service(ServletRequest servletRequest,ServletRespon seservletResponse);
    会被多次调用,每次请求都会调用Servlet方法,用于响应请求
  3. Public void destroy();
    只被调用一次,在当前Servlet所在的Web应用被卸载前带哦用,用于销毁当前Servlet对象,释放空间

创建一个Servlet程序的步骤:

  1. 实现Servlet接口
  2. 根据所需功能实现其内部的方法
  3. 在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应用程序对象。

功能:

扫描二维码关注公众号,回复: 6215338 查看本文章
  1. 获取Web应用程序的初始化参数
  2. 记录日志
  3. application域范围的属性
  4. 访问资源文件
  5. 获取虚拟路径所映射的本地路径
  6. Web应用程序之间的访问
  7. 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的会话方式:

  1. 客户端向服务器建立链接
  2. 客户端发送请求信息
  3. 服务器回送响应信息
  4. 服务器关闭连接

浏览器与Web服务器的连接过程是短暂的,每次连接至处理一个请求和响应。
每一个页面的访问都需要建立一次单独的连接。
浏览器和Web服务器之间的所有通讯之间都是完全相互独立分开的。

浏览器访问多图网页的过程

HTTP请求消息:
请求消息结构:
一个请求行、若干消息头、实体内容。
HTTP请求消息
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()

URI和URL

如何接受一个请求:

  1. 在HTML文件中,表单中设置该请求的url
  2. 编写相应的Servlet,实现其中的Service方法去处理该请求
    • 使用servletRequest获取请求
    • 对请求进行处理
  3. 在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()方法为抽象方法。

具体实现:

  1. 在GenericServlet中声明一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行初始化。
  2. 利用ServletConfig成员变量完成ServletConfig接口的实现。
  3. 还定义了一个init()方法,在init(ServletConfig)中对其进行调用,子类直接覆盖init()对Servlet进行初始化,原先的init(ServletConfig)由Servlet容器进行调用时会执行其中的init()进行初始化。

HttpServlet对象

  1. 针对于HTTP协议定义的一个Servlet类,继承自GenericServlet。
  2. 在service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse并调用了重载的service(HttpServletRequest,HttpServletResponse)
  3. 定义了doXxxx();(doGet()or doPost())方法,实际开发中,根据请求的方式直接覆盖相应的方法即可。并不需要覆盖service(HttpServletRequest,HttpServletResponse)方法,在定义好的service(HttpServletRequest,HttpServletResponse)方法中通过判断method然后调用相应的doGeet()或doPost()。

好处:

  • 不需要考虑请求方式,因为直接使用相应方法即可。
  • 不需要进行强行转换

JSP

JSP概述

  1. JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码编写,固定不变的内容则使用普通静态HTML页面的方式编写
  2. JSP页面中的Java代码放在body节点中的<% %>中
  3. JSP页面可以放置在Web应用程序除WEB-INF之外的其他任何目录中。
  4. 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的隐含对象。
  1. reqiest,即HttpServletReqiest
  2. response,即HttpServletResponse(在JSP页面中几乎不会使用)
  3. pageContext,页面的上下文,可以从来对象中获取其他的八个隐含对象,也可以从中获取当前页面的其他信息
  4. session,指的是客户端和服务器的一次会话
  5. application,代表当前的应用,即ServletContext对象
  6. config,当前JSP页面所对应的Servlet的ServletConfig对象(几乎不使用),如果访问当前JSP配置的初始化参数,则需要通过映射的地址out,JspWriter对象,调用out.println()方法可以直接向浏览器输出
  7. page,指向当前JSP对应的Servlet对象 的引用,但为Object类型,只能调用Object类的方法(几乎不使用)
  8. exception,在声明了page指令的isErrorPage=“true”时才可以使用,用于错误处理

在web.xml文件的配置中,servlet中使用jsp-file进行设置文件,需要在路径前加/代表根目录

JSP指令

JSP指令的作用时为当前页面做一些基本的属性设置,为当前页面的运行提供基本的环境。
根据功能不同,JSP中包含三类指令:page指令(页面指令)、include指令(包含指令)和taglib指令(标签库指令)。
使用语法格式如下:
<%@ 指令名称 属性名=属性值 属性名=属性值 属性名=属性值 。。。。 %>
page指令:

page指令用于设置当前JSP页面的相关信息。一个JSP文件中可以包含多个page指令,常见的page指令的属性以意及用法如下:

  1. pageEncoding属性
    用于设置当前页面的编码,默认相应的文本为text/html
  2. contentType属性
    功能上和pageEncoding一样,没有默认的文本
  3. import属性
    用于导入JSP页面中Java代码所使用的类
  4. errorPage属性
    设置JSP中的java代码报错之后的跳转页面
  5. isErrorPage属性
    默认为false,修改为true将当前页面设置为错误处理页面
  6. session属性
    阻止 JSP 页面为那些尚不拥有会话的用户创建新的会话
include指令:
    <%@ include file="文件的绝对路径或相对路径"%>
效果为引入不同格式的文件。
静态联编:在编译之前,就已经把include引入的文件加入到代码中。
在静态联编引入的文件中,变量可以共享,所以两文件中不可以定义同名的变量

JSP动作

在JSP页面中大量使用Java代码块、表达式等内容,会使JSP页面非常乱。为了使页面变的简洁明了,尽量少的使用Java代码块和表达式,取而代之的使EL表达式、JSTL标签,以及JSP动作。
JSP动作是指使用系统定义好的标签来完成Java代码完成的功能。

语法格式:

<jsp:动作名称 属性名=属性值 属性名=属性值 。。。></jsp:动作名称>
或
<jsp:动作名称 属性名=属性值 属性名=属性值 。。。/>

JSP语法

JSP模板元素:
  1. 在JSP页面中的静态HTML内容称为JSP模板元素。
  2. JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
JSP表达式:
  • 可以直接输出页面上的一个变量:<%= data %>
JSP脚本片断:
  1. 指嵌套在<%和%>之中的一条或多条Java程序代码
  2. JSP脚本片断中的Java代码将被原封不动地搬进由JSP页面所编译成地Servlet地jspServlet方法中。
  3. 一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断中可以嵌入文本、HTML标签和其他JSP元素
  4. 多个脚本片断中地代码可以相互访问
  5. JSP脚本片断中的Java代码必须严格遵循Java语法,如:分号等
JSP声明:
  1. JSP声明将Java代码封装在<%! 和 %>中,这里面地代码将被插入进Servlet地jspServlet方法外面,所以JSP声明可用于定义JSP页面转换成地Servlet程序的静态代码块、成员变量和方法。
  2. 多个静态代码块、成员变量和方法可以定义在一个JSP声明中,也可以分开写。
  3. JSP隐式对象的作用范围仅限于Servlet的jspServlet方法,所以在JSP声明中不可以出现这些隐式对象。
JSP注释:
  1. <%-- --%>中书写注释

与属性相关的方法

  1. 方法:
    • Object getAttribute(String name);获取指定的属性
    • Enumeration getAttributeNames();获取所有属性名字组成的Enumeration对象
    • boolean removeAttribute(String name);移除属性
    • void setAttribute(String name,Object o);设置属性
  2. pageContext、request、session、application对象都有这些方法,这四个对象也称之为域对象
    • pageContext属性的作用域仅限于当前JSP页面
    • request属性的作用域仅限于同一个请求
    • Session属性的作用域仅限于一次会话:浏览器打开直到关闭称之为一次会话
    • application属性的作用域仅限于当前Web应用,是范围最大的属性

请求转发和重定向

请求转发
  • 请求转发的操作流程
  1. 调用HTTPServletRequest的getRequestDispatcher(“请求转发地址”)方法,获取RequestDispatcher对象。
  2. 调用RequestDispatcher的forward(request,response)进行请求的转发。
    servletRequest.getRequestDispatcher("/url").forward(servletRequest,servletResponse);
  • 请求转发的运行流程
  1. 客户端向服务器发送请求。
  2. 服务器接受请求并进行执行。
  3. 服务器将请求转向另一个URL,并执行。
  4. 服务器将另一个URL的响应反馈给客户端。
  • 请求的重定向

    • 用sendRedirect方法实现请求重定向
      httpServletResponse.sendRedirect("/world");
    • 请求重定向的运行流程
    1. 客户端向服务器发送请求。
    2. 服务器接受请求并返回给客户端一个响应,响应的内容是让客户端取访问另一个URL。
    3. 客户端向新得到的URL发起请求。
    4. 新的URL的服务器接受请求并将响应发送回客户端。
  • 请求重定向与请求转发的比较

  1. 请求的转发只需要客户端发送一次请求,而重定向需要客户端向新的URL再发送一次请求。
  2. 请求的转发不会改变网页的地址,而重定向会。
  3. 请求的转发因为只进行了一次请求的发送,所以效率较请求重定向较高。
  4. 请求的转发因为是在服务器自己执行获取了另一个URL的的响应,所以必须再服务器内部进行转发,而重定向因为是告诉客户端重新发送请求,所以可以进行服务器外部的跨域访问。

猜你喜欢

转载自blog.csdn.net/Benjalin_76_84/article/details/89642433