JavaWeb02

JavaWeb02

一、Web程序的执行流程

一句话,客户端发出请求,服务器处理请求后做出响应。

二、Servlet基本使用

2.1 Servlet是什么?

Servlet,全称Sevlet Applet,服务端小程序,是一种用java语言来开发动态网站的技术。

Servlet也是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该有servlet来完成处理!servlet需要我们自己来编写,每个servlet必须实现javax.servlet.Servlet接口

2.1.1Servlet的执行过程

当使用url进行对Tomcat请求时,访问流程如下所示

  1. 先找到Tomcat
  2. 根据url中的名称找到具体的项目
  3. 找到项目下的web.xml,然后寻找url-pattern,看有没有哪个pattern对应url中的值
  4. 找到servlet-mapping中的servlet-name
  5. 找到前面注册的servlet-name
  6. 根据servlet-class中的值找到对应的Servlet类并创建实例
  7. 执行Servlet中的方法
2.1.2 Servlet的生命周期

在这里插入图片描述

2.2为什么使用Servlet?

  • Servlet是在服务器端运行的Java程序,可以接收客户端的请求并做出响应
    在这里插入图片描述

  • Servlet可以动态生成HTML内容对客户端进行响应
    在这里插入图片描述

Servlet与JSP的关系

  • JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
  • JSP更擅长表现于页面显示,servlet更擅长于逻辑控制。
  • 客户端发出请求,服务器通过JSP将Java代码翻译、编译后,Servlet再将Java代码生成HTML代码响应给客户端。
    在这里插入图片描述

2.3怎么实现Servlet

2.3.1实现javax.servlet.Servlet接口;
(1)在java类里实现Servlet接口
public class TestServlet implements Servlet {

	@Override
	public void destroy() {
		//销毁方法 临si前调用一次
		System.out.println("销毁了");
			}

	@Override
	public ServletConfig getServletConfig() {
		//获取Servlet下的ServletConfig对象
		//ServletConfig对象获取web.xml的信息
		return null;
	}

	@Override
	public String getServletInfo() {
		//获取Servlet的相关系统信息
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		//Servlet初始化 启动后只调用一次
		System.out.println("初始化");

	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		//处理客户端请求,每次处理请求时都会被调用
		System.out.println("处理请求");

	}

}
(2)再在web.xml里为Servlet配置Servlet路径

为什么要配置路径?

浏览器不能直接访问Java文件,而Servlet在在Java文件里,所以需要在web.xml里为Servlet配置Servlet路径,将Servlet和Servlet路径绑定,让浏览器访问Servlet路径,从而访问到Servlet。

  <!-- 配置servlet(RegisterServlet) -->

    <servlet>
    <description></description>
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>com.zking.test.RegisterServlet</servlet-class>
  </servlet>

  <!-- 映射servlet(RegisterServlet) -->
  <servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <url-pattern>/RegisterServlet</url-pattern><!-- 请求路径,记得加"/"! -->
  </servlet-mapping>

<!-- 注意:但凡是改了web.xml文件的内容 务必记得重启服务器再运行!!! -->
2.3.2继承javax.servlet.http.HttpServlet类

HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。

创建HttpServlet步骤

  • 继承HttpServlet抽象类
  • 重写HttpServlet的部分方法,如doGet()或doPost()方法
  • 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
  • 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果

HttpServlet的实现由两种方式

实现方式一:.xml配置实现
	A.配置xml文件(实现方式同Servlet接口的.xml配置相同,此处不再重复)
	B.继承HttpServlet抽象类
	C.重写get()、post()方法
实现方式二:注解实现
	直接在Package包下新建Servlet

在Servlet3.0开始,可以通过注解的方式进行配置Servlet,不用在web.xml中再进行配置。

  • 好处:
    • 支持注解配此。可以不要web. xml了。
  • 步骤:
    • 创建JavaEE项目, 选择Servlet的版本3.0以上,可以不创建web . xml
    • 定义一个类,继承Servlet接口
    • 复写方法
    • 在类上使用@WebServlet注解,进行配说
      • @webServlet(“资源路径”)|
/**
 * Servlet implementation class Register
 */
@WebServlet("/RegisterServlet.do")//请求路径
public class Register extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Register() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

三、request和response

3.1HttpServletRequest

HttpServletRequest表示请求。Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。

  • HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口
String getParameter(String name)】:根据name值得到value值
【String getParameterValues(String name)】:根据name值得到多个value值 例如:爱好

【void setCharacterEncoding(String charset)】:设置请求的编码方式 防止中文乱码
【void setAttribute(String key, Object value)】:存值[键值对的方式]Object getAttribute(String key)】:根据键拿到值

其中,getParameter是在ServletRequest中最常用的方法,可用于获取查询字符串的值。

3.2HttpServletResponse

javax.servlet.ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。

【void setContentType(String arg0)】:设置响应的编码方式
【PrintWriter getWriter()】:获得内置对象out

其中的getWriter方法,它返回了一个可以向客户端发送文本的的Java.io.PrintWriter对象。默认情况下,PrintWriter对象使用ISO-8859-1编码(该编码在输入中文时会发生乱码)。

在向客户端发送响应时,大多数都是使用该对象向客户端发送HTML。

在Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。 由于HTTP请求消息分为状态行,响应消息头,响应消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。

四、JSP页面表单提交方式

两种方式
<form action="请求路径url" method="get/post"></form>
1.get(默认)

是用来从服务器上获得数据;地址栏会显示信息;安全性低;有数据长度的限制,最大为1024字节;

2.post(推荐)

是用来向服务器上传递数据;安全性高

3.方法
  • 1.type=“submit”
  • 2.type=“image”
  • 3.使用链接来提交表单,javascript的DOM模型
  • 4.通过onsubmit事件提交
  • 5.通过ajax提交

五、页面跳转方式

  • 使用href超链接标记 客户端跳转
  • 表单提交 客户端跳转
  • 使用JavaScript 客户端跳转
  • 重定向:使用 response.sendRedirect() 客户端跳转
  • 转发:使用RequestDispatcher.forward() 服务器跳转
  • 使用forward动作标记 服务器跳转【后面将 JSTL】
  • 使用response对象实现页面跳转的第二种方法,setHeader()方法

5.1客户端跳转

5.1.1 href 超链接
<a href="想要跳转的jsp页面">跳转<a/>
例如:<a href="newPage.jsp">跳转<a/>

<a href="想要跳转的url">跳转<a/>
例如:<a href="https://blog.csdn.net/weixin_43656426">跳转<a/>

5.1.2表单提交 客户端跳转
<form name="form1" method="POST" action="newPage.jsp">  ------action中可以是jsp页面也可以是url路由
   <input type="text" name="name">  
   <input type="text" name="password">  
   <input type="submit" value="提交">  
</form>
5.1.3使用JavaScript 客户端跳转
//Js 页面跳转(父页面,外层页面,本页面)
"window.location.href=''""location.href=''"//是本页面跳转

"window.navigate('')"

"window.location.replace('')"

"parent.location.href=''"//是上一层页面跳转

"top.location.href=''"//是最外层的页面跳转
5.1.4转发跳转

使用 response.sendRedirect() 跳转

response.sendRedirect("newPage.jsp");//jsp页面
response.sendRedirect("https://blog.csdn.net/weixin_43656426");//url路径
5.1.5setHeader()方法
response.setCharacterEncoding("utf-8");  
response.setHeader("iso-8859-1","utf-8");  
request.setCharacterEncoding("utf-8");  
response.setHeader("Refresh","5;url=newPage.jsp");  
response.setHeader("Refresh","等待的秒数;url=绝对路径或者相对路径"); //路径问题sendredirect也一样,绝对路径相对路径都没意见,此句代码是等待5秒之后跳转

5.2服务端跳转

5.2.1重定向

RequestDispatcher.forward()跳转

request.getRequestDispatcher("newPage.jsp").forward(response,request);
request.getRequestDispatcher("https://blog.csdn.net/weixin_43656426").forward(request,response);
5.2.2forward动作标记
<jsp:forward page="newPage.jsp" /> 

5.3转发和重定向

在这里插入图片描述

  • 请求转发属于内部跳转,服务器内部转发,整个过程处于同一个请求当中,不可以跳到其他网站,只能在同一个网站内跳不同的页面

  • 重定向则是站外跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求

  • 取值

    • 请求转发(站内跳转):可以获取保存在request作用域中的数据
    • 重定向(站外跳转): 不能获取保存在request作用域中的数据
  • 地址栏

    • 请求转发(站内跳转):地址栏不发生变化
    • 重定向(站外跳转):地址栏显示跳转页面路径
  • 请求次数

    • 请求转发(站内跳转):仅发起一次请求,所以可以获取到保存在request中的数据
    • 重定向(站外跳转):发起多次请求,所以不能获取request中的数据
  • 性能(效率)

    • 请求转发(站内跳转) > 重定向(站外跳

六、ServletConfig类详解

6.1 基本介绍

概述

ServletConfig是Servlet的配置参数对象,在Servlet的规范中,允许为每一个Servlet都提供一些初始化的配置,所以每一个Servlet都有一个ServletConfig。

作用

当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init()方法传入一个ServletConfig对象,即传入一些配置信息给Servlet。

生命周期

应用一加载则创建,应用停止则被销毁;

创建时间

创建完Servlet对象时,接着创建。Servletconfig对象

常用方法

返回值方法名说明
StringgetInitParameter(String name)根据参数名称获取参数的值
EnumeratingetInitParameterNames()根据所有参数名称的枚举
StringgetSevletName()获取servlet的名称
ServletContextgetServletContext()获取servletContext对象

6.2 ServletConfig的配置方式

  • 在标签种,通过标签来配置。有两个子标签:
    • :代表初始化参数的key。
    • : 代表初始化参数的value
<!-- 配置servlet(HelloServlet) -->
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>com.zking.HelloServlet</servlet-class>
    <!-- 初始化参数 -->
  	<init-param>
  		<param-name>参数名</param-name>
  		<param-value>参数对应值</param-value>
  	</init-param>
  </servlet>

<!--只能在对应的一个servlet中拿到值:-->
this.getInitParameter("参数名");

七、ServletContext类详解

7.1 ServletConText介绍

概述:ServletContext对象是一个应用上下文对象,也是一个域对象。表示Servlet应用程序,每个web应用程序都只有一个ServletContext对象。

ServletContext对象的作用

  • 有了ServletContext对象,就可以共享从应用程序中的所有资源访问到的数据信息,并且可以动态注册web对象。
  • 可以获得应用域的全局初始化参数,以及达到Servlet之间的数据共享
  • 可以作为域对象在整个应用中共享数据;域对象即在一定的作用范围内实现资源共享;
  • 可以用来获取应用中的资源在服务器上的绝对路径;
  • 获取文件的mime类型: 在网络传输中,并不是以扩展名来区分文件的类型,都是以mime类型;如:text/html;表示一个html文件。

生命周期: 应用一加载则创建,应用被停止则销毁

创建时间: 加载web应用时,创建ServletContext对象。

域对象

  • 域对象指的是对象有作用域,即有作用范围。域对象可以实现数据的共享,不同作用范围对象,共享数据的范围能力也不同。
  • 在Servlet规范中,一共有4个域对象。其他三个是:request请求域PageContext页面域session会话域。ServletContext就是其中的一个。是web应用中最大的作用域,也叫application应用域,可以实现整个应用之间的数据共享!

常用方法

返回值方法名说明
voidsetAttribute(String name,Object value)向域对象中存储数据
ObjectgetAttribute(String name)通过名称获取域对象中的数据
voidremoveAttribute(String name)通过名称移除域对象中的数据
EnumerationgetAttributeNames()获取域对象中所有数据的名称
StringgetSevletContextName()获取servletContext的名称
StringgetContextPath()获取当前应用的访问虚拟目录
StringgetServletInfo()获取服务器名称和版本信息
StringgetInitParameter(String name)根据名称获取全局配置的值
EnumerationgetInitParameters()获取全局配置的所有名称
StringgetRealPath(String path)根据虚拟目录获取应用部署额磁盘绝对路径

7.2 ServletContext配置方式

  • ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;
  • 在标签中,通过标签来配置,有两个子标签:
    : 代表全局初始化参数的key。
    : 代表全局初始化参数的value。
<context-param>
  	<param-name>参数名</param-name>
  	<param-value>参数对应值</param-value>
</context-param>

<!--可被整个应用共享:-->
this.getServletContext().getInitParameter("参数名");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值