Servlet
servlet技术
概念
狭义的servlet是指java语言实现的一个接口,广义的servlet是指任何实现了这个servlet接口的类,一般情况下,人们将Servlet理解成后者。servlet运行于支持java的应用服务器中,从原理讲,servlet可以响应任何类型的请求,但绝大多数servlet指用来来扩展基于HTTP协议的web服务器。
特点
运行在支持Java的应用服务器上;
servlet的实现遵循服务器能够识别的规则,也就是服务器会自动的根据请求调用相应的servlet进行请求处理。
简单方便,可移植性强。
使用
1.创建普通的java类并继承HttpServlet
2.覆写service方法
3.在service中书写逻辑代码即可
4.在webRoot(WebContent)中的WEB-INF下的web.xml文件中配置servlet
servlet实例
1.新建一个web工程
file->new->Dynamic Web project->name
2.在Java Source->src下建立一个Java包,新建一个servlet类
两种方法建立。一是建立一个普通的Java类,继承HttpServlet,再覆写service方法。二是直接建立一个servlet类,命名后点击next,配置web.xml文件。在Java类中会出现一个@WebServlet("/+参数")注释,参数为次servlet的别名。
3.web.xml的一种配置方式为点击工程名->Java EE tools->Generate->Deployment Descriptor stub然后项目自动生成一个位于WEB-INF下的web.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
//========================等号之间的语句表示是对一个servlet类的配置
<servlet>
<servlet-name>my</servlet-name>//my代表一种对应关系
<servlet-class>chap02.MyServlet</servlet-class>//标志servlet类的包
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>//必须和servlet中servlet-name中的内容一致
<url-pattern>/my</url-pattern>//servlet类的别名,在浏览器访问时使用
</servlet-mapping>
//==========================
</web-app>
servlet实例代码
package chap02;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("this is my first web,hahaha");
System.out.println("this is my first web");
}
}
完成后加载进Tomcat服务器,访问http://localhost:8080/chap02/my即可。
servlet生命周期
1.从第一次调用到服务器关闭
2.在web.xml中servlet标签下添加1在都武器启动的时候启动,关闭时失效。
service和doGet,doPost的区别
service方法:可以处理Get/Post请求,如果servlet中有service方法,会优先调用 service方法进行处理。 如果service方法中有super.service(arg0,srg1)语句,则会根据请求方式调用父类中的 doGet/doPost方法。因此一般不添加该语句。
doGet方法:处理get请求
doPost方法:处理Post请求
servlet常见错误
404错误:资源未找到
原因一:在请求地址中华servlet别名书写错误。
原因二: 虚拟项目名称拼写错误。
500错误:内部服务器错误
错误一:Java.lang.ClassNotFoundException
解决方法:在web.xml文件中检验servlet类的全限定路径是否拼写错误。
错误二:因为service方法体的执行代码错误导致。
解决方法:根据错误提示对service方法的代码进行修改。
405错误:请求方式不支持
原因:请求方式和servlet的方法不匹配造成的。
解决方法;尽量使用service方法进行请求处理,并且不要在service方法中调用父类的service方法。
request对象的和获取请求头信息
request对象有Tomcat服务器创建的,并作为实参传递给处理请求的servlet 的service方法。
作用:request对象封存了当前请求的的所有请求信息。
使用:
1.获取请求头数据
//获取请求头
//获取请求方式
String method=req.getMethod();
//获取请求URL
StringBuffer url=req.getRequestURL();
//获取URI
String uri=req.getRequestURI();
//获取协议
String h=req.getScheme();
2.获取请求行数据
//请求行数据
//获取请求头里的键值对数据
//括号里的数据据为Header存在的键,返回字符串类型的值
String value=req.getHeader("User-Agent");
//返回所有请求的键的枚举
Enumeration e=req.getHeaderNames();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
3.获取请求用户的数据
//获取用户数据
//参数为form表单中的name值
String name=req.getParameter("name");
String pass=req.getParameter("pass");
//返回同键不同值的请求数据(多选),返回数组
//req.getParameterValues(name)
request对象的作用域
问题:不同发servlet之间怎么共享,或者说数据怎么从一个。
解决:使用request对象的作用域
req.setAttribute("name", "value");
req.getAttribute("name");
作用域:解决了一次请求内的不同servlet的数据共享问题。基于请求转发,一次请求中的所有servlet共享。
注意:使用request对象进行数据流转,数据只有在一次请求内有效。
Response学习
//设置响应头
resp.setHeader("name", "vlaue");
//resp.addHeader()可以追加响应头,如果使用resp.setHeader()会覆盖原有的数据
resp.addHeader("name1","value2");
//设置响应编码格式
resp.setHeader("cnntent-type", "tetx/html;charset=utf-8");
//或者是resp.setContentType("text/html;charset=utf-8");
//设置响应实体
resp.getWriter().write("hello");
请求转发
作用;实现多个servlet联动操作处理请求,避免代码冗余。让servlet的职责更加明确。
特点:一次请求,浏览器地址栏信息不变。
注意,请求转发后直接return。
req.getRequestDispatcher("目标servlet").forward(req, resp);
ServletContext学习
//获取servlecontex对象
//第一种方式
ServletContext sc=this.getServletContext();
//第二种方式
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3=req.getSession().getServletContext();
//获取项目web.xml的全局变量值
//如果数据不存在,返回值为null
//sc.getInitParameterNames(),返回键名的枚举
String initParameter=sc.getInitParameter("string name");
//获取webroot下的资源绝对路径
String path=sc.getRealPath("文件的相对路径");
//获取项目根目录下资源的的流对象
//sc.getRealPath("相对路径");
//此种方式只能获取根目录下的资源对象,class文件的流对象需要使用类加载器获取
web.xml文件全局变量配置格式
作用:将静态代码和数据解耦
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
ServletConfig
作用:ServletConfig是servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来web.xml的配置信息。
获取servletconfig
ServletConfig sc=this.getServletConfig();
String code=sc.getInitParameter(“name”);
web.xml配置格式
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
web.xml总结
作用:存储相关的配置信息,保护servlet。解耦一些数据对程序的依赖。
使用位置:
每个Web项目中
Tomcat服务器(在服务器的conf目录中)
区别:
Web项目下的web.xml文件为局部配置,针对本项目。
Tomcat下的web.xml文件为全局配置,配置公共信息。
内容:
全局上下文配置;
Servlet配置;
过滤器配置;
监听器配置;
如果web项目里的xml和tomcat服务器了的xml相同使用web项目里的xml文件(就近原则)
web容器会按照Servlet Context->context-param->listener->filter->servlet这个顺序加载组件,这些元素可配置在文件中的任意位置。加载时机 :服务器启动
session
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tsm99ta1-1603358023966)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200414150531069.png)]
jsp
概念:jsp全名为Java server Pages,中文名为Java服务器页面,其根本是一个简化的servlet设计。
特点:本质还是servlet,跨平台,一次编写,处处运行,组件跨平台,,健壮性和安全性。
jsp访问原理:浏览器发起请求,请求jsp,请求被tomcat服务器接受,执行jspservlet将请求的jsp文件转译成对应的Java文件,(也是servlet),然后执行转译后的Java文件(即执行转义后的servlet文件)。
jsp的语法和指令:
jsp的page指令
<%@page 属性名=”属性值“ 属性名=”属性值“ … %>
language:声明jsp要被转译的语言(当前只有Java)
import:声明要转译的Java文件要导入的包,不同的包有使用逗号隔开。
pageEncoding:设置jsp文件的数据编码格式
contentType=”text/html;charset=utf-8“ 设置jsp数据响应给浏览器时,浏览器采用的解析和编码格式。
session:设置转译后的servlet是否开启session支持,默认是开启,true表示来气,false表示关闭。
errorPage:设置jsp运行错误后跳转的页面
extends:设置jsp转译的Java文件要继承的父类(包名+类名)
jsp的taglib指令
jsp的局部代码块
特点:局部代码块中的Java代码会被原样转移到jsp对应的servlet文件的service方法中。代码块声明变量都是局部变量。
使用:<% java 代码>
缺点:使用局部代码块在jsp中进逻辑判断,书写麻烦,阅读困难。
开发:servlet进行逻辑判断,使用jsp进行页面展示。
Java全局代码块
特点:声明的Java代码作为全局变量转移到servlet类中
使用:<! 全局代码>
注意:全局代码块申明的代码,需要使用局部代码块调用。
jsp脚本段语句
特点:帮助我们快速地获取变量或者方法的返回值作为数据响应给浏览器。
使用:<= 变量名或方法名>
注意:不要在 变量名或方法名后使用分号。
jsp的注释:
- 前端语言注释:会被转译,也会被发送,但不会被浏览器执行。
- Java语言注释:会被转译,但不会被servlet执行。
- jsp注释:不会被转译。
jsp的静态引入
<@include file=“jsp文件的相对路径”>
特点:会引入jsp文件和当前文件转译成一个Java文件使用。在网页中也就显示了合并后的效果。
注意:静态引入的jsp文件不会单独转译成Java文件。当前文件和静态引入的jsp文件不能使用Java代码块声明同名变量。
jsp的动态引入
<jsp:include page=“要引入jsp文件的相对路径”> </jsp:include>
特点:会将引入的jsp文件单独转译,在当前转译好的Java文件中调用引入的jsp文件。在网页中合并后显示。
注意:动态引入允许文件中声明同名变量。
页面转发
<jsp:forward page=“目标jsp”></jsp:forward>
请求路径不变,转发一次请求。
注意:在转发标签的两个标签之间除了写<jsp:param value=“值” name=“键”/>之外的任意字符均会报错。
通过request.getParameter("")访问数据。
jsp的内置对象
jsp文件在转译成对应的servlet文件的时候自动生成并声明的对象。我们在jsp页面中直接使用即可。
注意:内置对象在jsp页面中使用,使用局部代码块或脚本段语言,不能在全局代码块中使用。
pageContext:页面上下文对象,封存了其它八个内置对象,封存了当前jsp的运行信息。
注意:每个jsp文件单独有一个pageContext对象。
作用域:当前页。
request:封存当前请求数据的对象,由tomcat创建,一次请求。
session:此对象用来存储用户的不同请求的共享数据,一次会话。
application:是ServletContext对象,一个项目只有一个,存储用户共享数据的对象,以及完成其它操作。项目内。
response:响应对象,用来响应请求处理结果给浏览器的对象,设置响应头,重定向。
out:响应对象,jsp内部使用,带有缓冲区的响应对象,效率高于response。
page:代表当前jsp的对象,相当与 Java的this。
exception:异常对象,存储了当前运行的异常信息。
注意:使用对象需要在page指令中使用属性isErrorPage=”true“开启。
config:也就是ServlertConfig,主要来获取web.xml中的配置信息,完成一些初始化数据的读取。
Ajax
什么是Ajax
Ajax是一种创建交互式网页应用的网页开发技术。
不是一种新技术,是如下几种技术的组合应用
-
基于web标准XHTML+CSS的表示
-
使用DOM进行动态显示及交互。
-
使用XML和和XSLT进行数据交换和相关操作。
-
使用XMLHttpRequest进行异步数据查询,检索。
-
使用JavaScript将所有的东西绑定在一起
Ajax本质上是一个浏览器技术