servlet问题:
1.总结什么是servlet
servlet做什么用的?
处理请求 生成响应
1.1如果创建一个servlet?
1.实现servlet接口
2.继承GenericServlet类
3.继承HTTPServlet类(常用)
1.2 Servlet生命周期
无论有多少客户机访问Servlet,都不会重复执行init()
执行代码:
package cn.com.hopu;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println(“构造器”);
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("出生");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("HelloServlet被访问了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("死亡");
}
}
运行结果:
信息: Deployment of web application directory D:\实训\javaWeb工具\工具\apache-tomcat-7.0.92\webapps\manager has finished in 437 ms
构造器
出生
HelloServlet被访问了
HelloServlet被访问了
D:\实训\javaWeb工具\工具\apache-tomcat-7.0.92\bin\catalina.bat stop
Using CATALINA_BASE: “C:\Users\j3645.IntelliJIdea2018.2\system\tomcat\Tomcat_1_Java_Web02”
Using CATALINA_HOME: “D:\实训\javaWeb工具\工具\apache-tomcat-7.0.92”
Using CATALINA_TMPDIR: “D:\实训\javaWeb工具\工具\apache-tomcat-7.0.92\temp”
Using JRE_HOME: “D:\jdk1.8”
Using CLASSPATH: “D:\实训\javaWeb工具\工具\apache-tomcat-7.0.92\bin\bootstrap.jar;D:\实训\javaWeb工具\工具\apache-tomcat-7.0.92\bin\tomcat-juli.jar”
九月 11, 2020 8:44:05 下午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler [“ajp-apr-8009”]
死亡
1.3.请求的分发处理
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(“HelloServlet被访问了”);
//类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
//获取请求的方式
String method=httpServletRequest.getMethod();
System.out.println(method);
if (method.equals(“GET”)){
//处理get请求代码
doGet();
}else if(method.equals(“POST”)){
//处理post请求代码
doPost();
}
}
public void doGet(){
//处理get请求代码
}
public void doPost(){
//处理Post请求代码
}
···1.4Servlet常用对象:
ServletConfig 封装Servlet配置信息 一个servlet一个该对象
ServletContext 一个web项目一个该对象 数据共享
HttpServletResponse 处理响应
HttpServletRequest 处理请求
Web中的相对路径和绝对路径
在javaWeb中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
… 表示上一-级目录
资源名 表示当前目录/资源名
绝对路径:htp://p:port/工程路径/资源路径
web/斜杠的不同意义
在web中/斜杠是一种绝对路径。
/斜杠如果被浏览器解析,得到的地址是: htp:/p:por/
斜杠
/斜杠如果被服务器解析,得到的地址是: htp://ip:port/工程路径
1、/ servlet1< /url-pattern>
2、servletContext . getRealPath("/");
3、request . getRequestDispatcher("/");
特殊情况: response . sendRediect("/");(请求重定向)
把斜杠发送给浏览器解析。得到http://ip:port/
2.继承servlet类的继承体系,和关键方法
3.ServletConfig类的作用和用法(有哪些方法,关键方法的作用)
方法:
getServletName() 获取servlet程序的别名servlet-name
getInitParameter() 获取初始化参数init-param
getServletContext() 获取ServletContext对象
getInitParamerNames() 获取所有初始化参数init-param
作用:
用法:public void init(ServletConfig servletconfig) throws ServletException {
//获取servlet程序的别名servlet-name
System.out.println(servletconfig.getServletName());
//获取初始化参数init-param
System.out.println(servletconfig.getInitParameter(“name”));
}
结果:HelloServlet2
wowowo
hellpservlet2doget方法//servlet里面默认调用doget方法
4.ServletContext类的作用和用法(有哪些方法,关键方法的作用)
方法:
存数据 取数据 删除数据
域对象 setAttribute() getAttribute() removeAttribute()
作用:
一个web项目只有一个Context对象 该项目下的每个Servlet都可以访问
可以实现数据共享
1.获取全局配置信息
xml文件
username
wowowo
servletA代码
ServletContext ac = this.getServletContext();
//获取全局初始化参数的名称
Enumeration n = ac.getInitParameterNames();
while (n.hasMoreElements()){
String key = n.nextElement();
String s = ac.getInitParameter(key);
response.getWriter().print(key+"—"+s);
结果:
username—wowowo
-
2.获取项目资源
aa.heml
wowowo
222
//获取项目资源流
InputStream in = ac.getResourceAsStream("/WEB-INF/aa.html");
byte[] by=new byte[1024];
int len=0;
while((len=in.read(by))!=-1){
String s=new String(by,0,len);
System.out.println(s);
}
//获取项目资源下内容
Set s = ac.getResourcePaths("/");
for (String st:s) {
System.out.println(st);
}
运行结果
wowowo
222
/index.jsp /WEB-INF/什么是ServletContext?
1、ServletContext 是-一个接口, 它表示Servlet上下文对象
2、一个web工程,只有一-个ServletContext对象实例。
3、ServletContext 对象是-一个域对象。
4、ServletContext 是在web工程部署启动的时候创建。在web工程停止的时候销毁。
什么是域对象?
域对象,是可以像Map一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围。
存数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()
用法:
获取ServletContext对象:
1.通过ServletConfig对象方法获取
web.xml配置:
代码部分
protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1,获取veb. xmL中配置的上下文参数context -param
ServletContext context = getServ1etConfig().getServletContext();
String username = context . getInitParameter( name: " username");
System. out . println(" context- param参数username的值是:”+ username);
//2,获取当前的工程路径,格式: /工程路径
System. out . println(“当前工程路径:context.getContextPath() );
//3,获取工程部署后在服务器硬盘上的绝对路径
//斜杠鼓服务器解析地址为:http://ip:port/工程名/
System. out . println(“工程部署的路径是:” + context . getRealPath("/"));
}// "/"开始是从web文件夹下开始
2.通过继承父类方法获取
ServletContext context = getServletContext();
context.setAttribute(“key1”, “value1”);
System.out.println(context.getAttribute(“key1”));
5.简单描述HTTP协议
WEB浏览器与WEB服务器之间一问一答的交互过程必须遵循一定的规 则, 这个规则 HTTP协议
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个 用 于代表请求的request对象、和代表响应的response对象
request和response对象即代表了请求和响应,那我们要获取客户机 提 交过来的数据,只需要找request对象就可以了,要想客户机输出 数据,只需 要找response即可。
1.get请求
1.1、请求行
(1)请求的方式 GET
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
1.2、请求头
key: value组成.
不同的键值对,表示不同的含义。|
2.post请求
2.1.请求行.
(1)请求的方式 POST
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
2.2、请求头.
- key:value
不同的请求头,有不同的含义
空行
2.3、请求体==>>>
就是发送给服务器的数据
3.常用请求头的说明
Accept:表示客户端可以接收的数据类型
Accpet-Languege:表示客户端可以接收的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求时的服务器 ip和端口号
4.哪些是GET请求,哪些是POST请求
GET请求有哪些:
1、form 标签method=get
2、a标签
3、link标签引入csss
4、Script 标签引入js文件
5、img标签引入图片
6、iframe 引入html页面
7、在浏览器地址栏中输入地址后敲回车
POST请求有哪些:
8、form标签method=post
5.响应体
6.常用的响应码说明。
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
6.Get和Post的区别
HttpServlet中与这些请求方式相对应的方法
doGet(): 如果HTTP客户端发给服务器的请求是GET方 式,这个方法将被service方法调用
doPost(): 如果HTTP客户端发给服务器的请求是POST方式,这个方法会被service方法调用
区别:
1.Get会把参数拼接到url后面
使用POST方式传递参数:(参数存放在请求体中)
2.Get参数大小有限制
Post没有限制
3.Get没有请求体
Post有请求体 请求参数都是放在请求体中的
使用GET方式传递参数:(参数拼接在url后面)
- 在浏览器地址栏中输入某个url地址或单击网页上的一个超链接时 浏览器发出的HTTP请求方式为GET
- 如果网页中的b表单元素的method属性被设置为“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET
- 使用GET方式传送的数据量一般限制在1kb以下
使用POST方式传递参数:(参数存放在请求体中) - POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据:form表单的method值为POST
- POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大的多
7.HttpServletRequest类的API使用和继承体系
1.HttpServletRequest类有什么作用?
每次只要有请求进入Tomcat服务器, Tomcat服务器 就会把请求过来的HTTP协议信息解析好封装Request对象中。
然后传递到service方法( doGet和doPost)中给我们使用。我们可以通过HttpServletRequest 对象,获取到所有请求的信息。
2.常用的API使用
// i. getRequestURI() 获取请求的资源路径
System. out . println("URI =>”+ req. getRequestURI());
//ii.getRequestURL()获取请求的统一-资源定位符 (绝对路径)
System. out .println("URL =>”+ req. getRequestURL());
//iii. getRemoteHost()
获取客户端的ip地址
/**
*在IDEA中, 使用Localhost访问时,得到的客户端ip 地址是===>>> 127.0.0.1
*在IDEA中, 使用127.0.0.1访问时, 得到的客户端ip地址是->>> 127.0.0.1
*在IDEA中, 使用真实ip访问时,得到的客户端ip地址是=>>> 真实的客户端ip地址
*/
System. out.println("客户端ip地址=>”+ req. getRemoteHost());
//iv. getHeader()
获取请求头
System. out. print1p("请求头User-Agent ==>>”+ req. getHeader( name: “User- Agent”));
//vii. getMethod()-
获取请求的方式GET或POST
System.out.printin( 请水的万式 ==>> + req. getMethod() );
//设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
//也要在获取请求参数之前调用才有效
//post请求处理中文乱码
req . setCharacterEncoding(“UTF-8”);
//获取请求参数
String username = req. getParameter( name:“username” ) ;
String password = req. getParameter( name:“password” ) ;
String[] hobby = req. getParameterValues( name:“hobby”);
System. out . println("用户名:”+ username); .
System. out . println("密码:”+ password);
System. out. println("兴趣爱好:”+ Arrays .asList(hobby));
8.post请求如何处理中文乱码
//设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
//也要在获取请求参数之前调用才有效
//post请求处理中文乱码
req . setCharacterEncoding(“UTF-8”);
9.转发和重定向的区别,贴出相应的代码
1.请求转发是在服务器完成的,重定向是在客户端完成的
2.请求转发的速度快,重定向速度慢
3.请求转发的是同一次请求,重定向是二次不同的请求
4.请求转发地址栏没有变化,重定向地址栏有变化
5.转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成的
什么是请求的转发?
请求转发是指,服务器收到请求后,从-次资源跳转到另-一个资源的操作叫请求转发。
请求转发流程图
ServletA中
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//获取请求参数
System.out.println(“在ServletA中查看参数(资料)”+request.getParameter(“username”));
//给材料改一个章
request.setAttribute(“key1”, “ServletA的章”);
//访问web-INFO下的文件
RequestDispatcher requestDi spatcher = req . getRequestDispatcher( path:"/WEB- INF/form. html"); .
//问路 ServletB怎么走和走向ServletB
request.getRequestDispatcher("/servletB").forward(request, response);
ServletB中
//获取请求参数
System.out.println(“在ServletB中查看参数(资料)”+request.getParameter(“username”));
Object key=request.getAttribute(“key1”);
System.out.println(“查看是否有盖章”+key);
//处理自己的事情
System.out.println(“ServletB”);
运行结果
在ServletA中查看参数(资料)wowowo
在ServletB中查看参数(资料)wowowo
查看是否有盖章ServletA的章
ServletB
注意:一次请求 路径没有改变
请求转发的特点:
1.浏览器地址栏没有变化
2.他们是一次请求
3.他们共享Request域中的数据
4.可以转发到WEB-INF目录下
5.是否可以访问工程以外的资源 否
Servlet base标签的作用
这是a下的b下的c . html页面跳回首页
HttpServletRespanse类的作用
HttpServletResponse类和HttpServletRequest类- 样。每次请求进来,Tomcat服务器都会创建一个Response 对象传递给Servlet程序去使用。HttpServletRequest 表示请求过来的信息, HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置。
b)两个输出流的说明。
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
// 要求:
往客户端回传 字符串数据。
PrintWriter writer = resp. getwriter( );
writer.write( s:" response " s content!!!" );
结果
response s content!!!
response处理中文乱码
//System. out. println( resp. getCharacterEncoding() );//默认IS0-8859-1
//设置服务器字符集为UTF-8
//resp. setCharacterEncoding(“UTF-8”);
//通过响应头,设置浏览器也使用UTF-8字符集
//resp . setHeader( name: “Content-Type”, value: “text/html; charset=UTF-8”);
//它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp. setContentType(“text/html; charset=UTF-8”);
请求重定向.
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
请求重定向第一种方式
System.out.println(“到此一游A”);
//设置响应状态码 302 表示已搬迁
response.setStatus(302);
//设置响应头 说明新的地址在哪
response.setHeader(“Location”, “http://localhost:8080/servletB”);
response.getWriter().write(“ServletB”);
结果:
请求重定向第二种方式(推荐使用)
response . sendRediect(“http://localhost:8080”);
10.总结出所有的域对象和各自的作用,如何存值取
值,作用范围多大
四大域对象和作用范围
application 整个项目
session 一次会话(打开浏览器关闭浏览器 前提session没有销毁)
request 一次请求
pageContext 一个jsp页面
域对象的作用:保存数据 获取数据 共享数据
<%
pageContext.setAttribute("pkey", "4");
session.setAttribute("skey", "3");
request.setAttribute("rkey", "2");
application.setAttribute("akey", "1");
%>
<!-- 在当前页面获取四大域对象中数据 -->
pageContext:<%=pageContext.getAttribute("pkey") %><br/>
request:<%=request.getAttribute("rkey") %><br/>
session:<%=session.getAttribute("skey") %><br/>
application:<%=application.getAttribute("akey") %><br/>
结果:
pageContext:1
request:2
session:3
application:4
11.过滤器的作用和使用方式,贴出关键代码
1、Filter什么是过滤器
1、Filter 过滤器它是JavaWeb的三大组件之一。三大组件分别是: Servlet 程序、Listener 监听器、Filter 过滤器
2、Filter 过滤器它是JavaEE的规范。也就是接口
3、Fiter 过滤器它的作用是:拦截请求,过滤响应。
拦截请求常见的应用场景有:
1、权限检查
2、日记操作
3、事务管理
…等等
过滤器解析图
编写的过滤步骤:
1.创建一个类 实现一个filter接口(重写方法)
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println(“AFilter被访问了”);
过滤的业务逻辑
// HttpServletRequest httpServletRequest = (HttpServletRequest) ServletRequest;
// HttpSession session = httpServletRequest . getSession();
// object user = session. getAttribute( s: “user”);
//如果等null,说明还没有登录
// if (user == nu1l) {
// servletRequest . getRequestDispatcher( s: “/login. jsp”). forward(servletRequest , servletResponse);
// return;
// }else{
chain.doFilter(servletRequest , servletResponse);//放行
//}
}
2.在web.xml配置文件配置过滤器的拦截范围
AFilter cn.com.hopu.filter.AFilter AFilter /*<--拦截路径-->
12.监听器的作用和使用方式,贴出关键代码
什么是监听器?
1、Listener 监听器它是JavaWeb的三大组件之一。JavaWeb 的三大组件分别是: Servlet 程序、Filter 过滤器、Listener 监听器。
2、Listener 它是JavaEE的规范,就是接口
3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
ServletContextListener 监听器
ServletContextListener它可以监听ServletContext对象的创建和销毁。
ServletCpntext对象在web工程启动的时候创建,在web工程停止的时候销毁。
监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈。
两个方法分别是:
public interface ServletContextL istener extends EventListener {
/**
** Notification that the web application initialization process is starting.
- All ServletContextListeners are notified of context initialization before
- any filter or servlet in the web application is initialized.
“@param sce Information about the ServletContext that was initialized
public void contextInitialized(ServletContextEvent sce);
/**
** Notification that the servlet context is about to be shut down. ALL - servlets and filters have been destroy()ed before any
- ServletContextListeners are notified of context destruction.
- @param sce Information about the ServletContext that was destroyed
*/
public void contextDestroyed(ServletContextEvent sce);
如何使用ServletContextListener监听器监听ServletContext 对象。
使用步骤如下:
1、编写- -个类去实现ServletContextListener
2、实现其两个回调方法
package cn.com.hopu;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println(“ServletContext对象被创建了”);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被销毁了");
}
}
3、到web.xml中去配置监听器
cn.com.hopu.MyServletContextListener启动时创建
关闭服务器时销毁
13.javaEE三层架构
分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。
14.JSON(JavaScript Object Notation):(js对象表示法)是一种轻量级(和xml相比很轻量)的数据交换格式
写法格式:
{key:value,key:value};
value可以有很多种:
1:)基本的类型(字符串,数字,布尔值)
2:)数组
{lastName:“李四”,books:[“西游记”,{lastAge:18,score:100}]}(value取值非常多)
3:)对象{};
var student={}
js对象
如果服务器返回给浏览器数据是js对象这种样子,浏览器使用js解析就会很方便;
JSON:把js对象进行传输(HTTP(只能传输文本))
JSON.string();
将对象改为string类型
var student2={
“lastName”:“张三”,
“age”:18
}
alert(student2)
结果:
// JSON(js内置的对象)
var stringify = JSON.stringify(student);
alert(stringify)
结果:
JSON.parse();
将字符串类型转换为js对象
alert(stringify.lastName);
// 想使用这个字符串,并获得到它原来代表的js对象里面的属性值
// 需要把字符串(满足js对象表示法(json)格式)转换为js对象
var stu=JSON.parse(stringify);
alert(stu.lastName);
结构顺序
15.AJAX(“Asynchronous Javascript And XML”(异步 JavaScript 和 XML))
AJAX:是一种无刷新页面与服务器交互的技术:(页面不刷新就可以收到服务器响应的数据)
原来的交互
1.浏览器发送请求
2.服务器接收到了请求,调用对应的servlet进行处理:servlet处理完成会有响应信息生成;
3.浏览器接收到了服务器响应的数据,把之间的页面清除,展示新的数据,展示的效果就是页面刷新
现在的交互:(XmlHttpRequest对象)
1.XmlHttpRequest对象帮我们发送请求
2.服务器接收到了请求,调用对应的servlet进行处理:servlet处理完成会有响应信息生成;
3.XmlHttpRequest对象收数据(浏览器就感受不到这个数据了
;xhr对象收到这个数据)
XmlHttpRequest对象
所有现代浏览器均支持XmlHttpRequest对象
xhr原生编程:
var xhr=new XmlHttpRequest();//创建xhr对象;
xhr.open(“DET”,“请求地址”,true);//建立连接
xhr.send();//通过地道传输数据;
xhr.onreadystatechange=function () {
if (xhr.readyState4&&xhr.status200){
document.getElementById(“myDiv”).innerHTML=xhr.responseText;//拿到返回的内容:字符串
}
}
非常麻烦
使用jquery包装后的ajax请求
$.get()
$.post()
$.ajax()
$("#aBtn").click(function () {
.
g
e
t
(
"
.get("
.get("{pageContext.request.contextPath}/helloServlet",{lastName:“wowo”,age:20},function (abc) {
//abc代表服务器给我们的数据,如果服务器转发到一个页面,data代表整个页面
// alert(abc);
$("#hha").append(abc);
},“text”);
return false;
})
国际化:根据Locale代表的区域信息可以进行国际化
1.得到你需要国际化的区域信息