JavaWeb02
一、Web程序的执行流程
一句话,客户端发出请求,服务器处理请求后做出响应。
二、Servlet基本使用
2.1 Servlet是什么?
Servlet,全称Sevlet Applet,服务端小程序,是一种用java语言来开发动态网站的技术。
Servlet也是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该有servlet来完成处理!servlet需要我们自己来编写,每个servlet必须实现javax.servlet.Servlet接口
2.1.1Servlet的执行过程
当使用url进行对Tomcat请求时,访问流程如下所示
- 先找到Tomcat
- 根据url中的名称找到具体的项目
- 找到项目下的web.xml,然后寻找url-pattern,看有没有哪个pattern对应url中的值
- 找到servlet-mapping中的servlet-name
- 找到前面注册的servlet-name
- 根据servlet-class中的值找到对应的Servlet类并创建实例
- 执行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对象
常用方法
返回值 | 方法名 | 说明 |
String | getInitParameter(String name) | 根据参数名称获取参数的值 |
Enumeratin | getInitParameterNames() | 根据所有参数名称的枚举 |
String | getSevletName() | 获取servlet的名称 |
ServletContext | getServletContext() | 获取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应用域,可以实现整个应用之间的数据共享!
常用方法
返回值 | 方法名 | 说明 |
void | setAttribute(String name,Object value) | 向域对象中存储数据 |
Object | getAttribute(String name) | 通过名称获取域对象中的数据 |
void | removeAttribute(String name) | 通过名称移除域对象中的数据 |
Enumeration | getAttributeNames() | 获取域对象中所有数据的名称 |
String | getSevletContextName() | 获取servletContext的名称 |
String | getContextPath() | 获取当前应用的访问虚拟目录 |
String | getServletInfo() | 获取服务器名称和版本信息 |
String | getInitParameter(String name) | 根据名称获取全局配置的值 |
Enumeration | getInitParameters() | 获取全局配置的所有名称 |
String | getRealPath(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("参数名");