http的协议的作用是:
规范服务器和浏览器的数据交互
特点:
简单快速,使用键值对进行发送数据
比较灵活,没有数据类型进行规定
无连接,一次连接只处理一个请求
http1.1之后支持可持续连接
无状态,对数据没有记忆功能
http协议的请求格式:
请求头,请求方式,请求地址和http协议版本
请求行,消息报头,一般用来说明客户端要使用的一些附加信息
空行,位于请求行和请求数据之间,空行是必须的
请求数据,非必须
get请求方式没有数据主体
post请求方式有数据主体
http的请求方式:
1.0:get,post,head
1.1:options,put,delete,trace,connect
get和post请求方式的区别:
一:
get:请求数据是空的,用问号隔开将请求数据放在了请求头里
post:具有请求数据
二:
get:传的是少量的信息
post:可以传大量的信息
三:
get:不安全
post:安全(在请求头里不可以看到具体的数据)
服务器响应的格式:
响应行:http的版本,状态码,状态消息
响应头:消息报头,客户端使用的附加信息
空行:
响应的实体:
http常见响应状态码含义:
http状态码由是三个十进制数字组成,第一个十进制数字定义了状态码的类型,后面的
两个数字没有分类的作用
200 ok 表示客户端请求成功
400 Bad Request 客户端请求语法错误,不能被服务器理解
401 Unauthorized 请求没有被授权
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 not found 请求资源不存在
500 internal service error 服务器发生不可预期的错误
503 service unavailable 服务器当前不能处理客户端的请求,一段时间恢复正常
tomcat服务器:
服务器是代码写的容器,用来自动运行代码
服务器找的是servlet接口类来识别代码的,和java虚拟机调用main方法相似
使用:
1.创建普通的java类,并且继承httpservlet
2.覆写service方法
3.在service方法中书写逻辑代码即可
4.在webcontent下的web-inf文件夹下的web.xml文件中配置servlet
servlet‘的生命周期:
1.从第一次调用到服务器关闭
2.如果在web.xml配置了load-on-start属性,生命周期从服务器打开到服务器关闭
注意:
init()方法是对servlet从初始化的方法,会在servlet第一次加载进行储存是被调用
destory()方法是对servlet进行销毁,在servlet被销毁的时候调用,服务器关闭的时候调用
文件发生更改才能重新编译
类什么时候被加载到内存?
第一次调用的时候进入内存
类什么时候被销毁?
服务器关闭的时候被销毁
http的交互流程:
第一步,客户端和服务器建立连接
第二步,客户端发送请求数据到服务器端
第三步,服务器接收到请求后进行处理将响应的结果返回给客户端
第四步,关闭客户对岸设服务器的连接(http1.1之后不会立刻关闭)
以上过程称为消息
servlet服务的运行流程:
url的组成:
服务器地址端口号/webapps下的文件夹的名称/要执行的servlet的url-pattern
web.xml配置的是servlet服务类的别名,具有安全性(class属性)
service方法和doget方法和dopost方法:
service方法:可以通过get和post请求
doget方法:只可以通过get请求
dopost方法:只可以通过post请求
如果在service方法中书写了super():
如果service和doget和dopost方都存在,优先调用service方法,
再父类的service方法,调用doget和dopost其中一个方法
如果不书写:
只调用本类的service方法,不再调用父类的service
因此一般情况下我们不书写super()方法,避免出现错误
404错误:资源未找到
原因一:在请求地址中servlet的别名书写错误
原因二;虚拟项目名称拼写错误
500错误:
原因一;类的路径错误
解决办法:
在web.xml文件中进行校验
原因二:类的具体方法逻辑或者语法错误
解决办法:
对类中的方法代码进行改错
405错误;请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的
解决方法:尽量使用service方法进行处理,并且不要再service方法
中调用父类的service方法
request对象:
服务器接收请求对象,创建request对象将实参传入servlet方法
作用:
封存了当前请求的所有信息
使用:
获取请求头数据
获取请求行数据
获取用户数据
注意:
request对象的创建由tomcat服务器创建,并作为实参传入到servlet的service方法中
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
-
Servlet implementation class re
*/
public class re extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//获取请求方式
String str=arg0.getMethod();
System.out.println(str);
//获取请求url
StringBuffer str1=arg0.getRequestURL();
System.out.println(str1);
//获取uri
String str3=arg0.getRequestURI();
System.out.println(str3);
//获取协议}
}
无论是get还是post请求,获取数据都是通过request方法来获取键值
用get和post请求的区别就是请求数据的可见性问题,安全性问题
//获取请求方式
String str=arg0.getMethod();
System.out.println(str);
//获取请求url
StringBuffer str1=arg0.getRequestURL();
System.out.println(str1);
//获取uri
String str3=arg0.getRequestURI();
System.out.println(str3);
//获取协议
String str4=arg0.getScheme();
System.out.println(str4);
//获取请求头的数据
//获取指定的请求行的信息
String value=arg0.getHeader(“aaa”);
System.out.println(value);
//获取所有的请求行的键的枚举
Enumeration e=arg0.getHeaderNames();
while(e.hasMoreElements()) {
String str5=(String)e.nextElement();
String str6=arg0.getHeader(str5);
System.out.println(str5+":"+str6);
}
//获取请求数据
String name=arg0.getParameter("uname");
String password=arg0.getParameter("pwd");
System.out.println("******************");
System.out.println(name);
System.out.println(password);
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
- response
- 作用:
- 用来响应数据到浏览器的一个对象
- 使用:
- 设置响应头
-
setHeader//在响应头中添加信息,但是同键会覆盖
-
addHeader//在响应头中添加信息,但是同键不会覆盖
-
senderror//设置错误
- 设置响应实体
*/
public class response extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//设置响应编码格式
arg1.setContentType(“text/html;charset=utf-8”);
//获取请求信息
//处理请求
//响应处理结果
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write(“用户名:
”);
arg1.getWriter().write(“密码:
”);
arg1.getWriter().write("
");
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write("");
}
}
乱码问题解决:
1.对string进行重新编码
name=new String(name.getBytes(“iso8859-1”),“utf-8”);
2.使用公共的配置
get方式:
1)在获得请求数据之前设置请求编码格式
arg1.setcontentype(“utf-8”);
2)在tomcat的目录下的conf目录中修改server.xml文件,在connector
标签中增加属性usebodyencodingforuri=“true”
usebodyencodingforuri=“true”
post方式:
在获得请求数据之前设置请求编码格式
arg1.setcontentype(“utf-8”);
1.浏览器发起请求到服务器
2.服务器接收浏览器的请求,进行解析,创建request对象储存请求数据
3.服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
4.servlet的方法执行请求处理(重点)
1)设置请求编码
2)设置响应编码格式
3)获取请求数据
4)处理请求信息
创建业务层对象
调用业务层对象的方法
5)响应处理结果
浏览器------->服务器------->数据库
浏览器<-------服务器<-------数据库
请求转发:
作用:实现多个servlet联动操作处理请求,这样避免了代码累赘,让servlet的职责更加明确。
使用:
//让服务器多次次调用servlet
arg0.getRequestDispatcher(“response”).forward(arg0, arg1);
特点:
一次请求,浏览器地址栏地址不变
请求转发转发后直接return结束即可,不需要再处理
request的作用域:一次请求的完成
使用request实现不同的servlet的数据流转
arg0.setAttribute("", “”);
arg0.getAttribute("","");
作用:
解决了一次请求不同servlet的数据共享问题
注意:
使用request对象进行数据流转,数据只在一次请求内有效
特点:
服务器创建
生命周期一次请求
每次请求都会创建
重定向学习
问题:
1)如果使用请求转发造成表单数据重复提交怎么办
2)如果servlet无法处理请求怎们办
解决:
解决了表单重复提交的问题,servlet无法处理的问题
使用:
arg1.sendRedirect("/wangsiwei-servlet4/main");
特点:
两次请求,两个request对象(数据流转是一次请求)
地址栏的信息是改变的,
使用的时机:
如果请求中有表单按数据,而数据又比较重要,不能重复提交,建议使
用重定向
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
-
cookie学习:
-
作用:解决了发送不同请求之间的数据共享
-
使用:
-
//创建cookie对象(可选)
-
//设置有效期
-
c2.setMaxAge(3*24*3600);
-
//设置有效路径
-
c2.setpath("/04-servlet/abc");
-
Cookie c=new Cookie("mouse","thinkpad");
-
//响应cookie信息给客户端
-
arg1.addCookie(c);
-
//cookie的获取
-
Cookie [] cks=arg0.getCookies(); for(Cookie c:cks) { String name=c.getName(); String value=c.getValue(); System.out.println(name+":"+value); }
-
注意:
-
一个cookie对象储存一条数据,多条数据可以多创建几个cookie对象进储存
-
特点:
-
浏览器端的数据储存技术
-
储存的数据声明在服务器端
-
临时储存,储存在浏览器的运行内存里,浏览器关闭就消失
-
定时储存,设置了cookie的有效期,储存在客户端的硬盘中,在有效期内符合路径的请求都会附带该信息
*/
public class cookieservlet extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//设置请求编码格式
arg0.setCharacterEncoding(“utf-8”);
//设置响应编码格式
arg1.setContentType(“text/html;charset=utf-8”);
//获取请求信息
//处理请求信息
//响应处理请求//使用cookie进行浏览器端的数据储存 //创建cookie对象 Cookie c=new Cookie("mouse","thinkpad"); Cookie c2=new Cookie("key","bjsxt"); //设置有效期 c2.setMaxAge(3*24*3600); c2.setPath("/04-servlet-cookie/gggg"); //响应cookie信息 arg1.addCookie(c); arg1.addCookie(c2); arg1.getWriter().write("cookie学习");
}
}
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
-
cookie学习:
-
作用:解决了发送不同请求之间的数据共享
-
使用:
-
//创建cookie对象(可选)
-
//设置有效期
-
c2.setMaxAge(3*24*3600);
-
//设置有效路径
-
c2.setpath("/04-servlet/abc");
-
Cookie c=new Cookie("mouse","thinkpad");
-
//响应cookie信息给客户端
-
arg1.addCookie(c);
-
注意:
-
一个cookie对象储存一条数据,多条数据可以多创建几个cookie对象进储存
-
特点:
-
浏览器端的数据储存技术
-
储存的数据声明在服务器端
-
临时储存,储存在浏览器的运行内存里,浏览器关闭就消失
-
定时储存,设置了cookie的有效期,储存在客户端的硬盘中,在有效期内符合路径的请求都会附带该信息
*/
public class cookieservlet extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//设置请求编码格式
arg0.setCharacterEncoding(“utf-8”);
//设置响应编码格式
arg1.setContentType(“text/html;charset=utf-8”);
//获取请求信息
//处理请求信息
//响应处理请求//使用cookie进行浏览器端的数据储存 //创建cookie对象 Cookie c=new Cookie("mouse","thinkpad"); Cookie c2=new Cookie("key","bjsxt"); //设置有效期 //c2.setMaxAge(3*24*3600); c2.setPath("/04-servlet-cookie/gggg"); //响应cookie信息 arg1.addCookie(c); arg1.addCookie(c2); arg1.getWriter().write("cookie学习");
}
}
两个servlet之间的数据共享实现
用到的两个方法;
存储: hs.setAttribute(“name”, name);
获取: hs.getAttribute(“name”);
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.si.loginservice;
import com.si.wei.loginimpl;
import com.wei.User;
/**
*
*/
public class login extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//设置响应编码格式
arg1.setContentType("text/html;charset=utf-8");
//获取请求信息
String name=arg0.getParameter("uname");
//乱码问题的解决
name=new String(name.getBytes("iso8859-1"),"utf-8");
String password=arg0.getParameter("pwd");
System.out.println(name+":"+password);
//处理请求信息
//创建session对象
HttpSession hs=arg0.getSession();
hs.setAttribute("name", name);
//获取业务层对象
loginservice ls=new loginimpl();
User u=ls.checklogin(name, password);
System.out.println(u);
if(u!=null) {
//创建cookie信息实现三天免登陆
Cookie c=new Cookie("uid",u.getUid());
//设置cookie的有效期
c.setMaxAge(3*24*3600);
c.setPath("/wangsiwei-servlet4/cookie");
arg1.addCookie(c);
//使用重定向
arg1.sendRedirect("/wangsiwei-servlet4/main");
}else {
arg0.getRequestDispatcher("response").forward(arg0, arg1);
arg0.setAttribute("", "");
}
//响应处理信息
}
}
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
- Servlet implementation class main
*/
public class main extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//设置请求编码
arg0.setCharacterEncoding(“utf-8”);
//设置响应编码
arg1.setContentType(“text/html;charset=utf-8”);
//获取请求数据
//创建session对象
HttpSession hs=arg0.getSession();
//获取session对象的数据
String name=(String)hs.getAttribute(“name”);
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write("");
arg1.getWriter().write(“欢迎”+name+“访问王思伟的管理系统
”);
arg1.getWriter().write("
");
arg1.getWriter().write("");
arg1.getWriter().write("");
}
}
package com.wang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
- 问题:
- 一个用户的不同请求处理的数据共享怎么办
- 解决:
- 使用session技术
- 原理:
- 用户第一次访问服务器,服务器
- 会创建一个session对象给此用户
- 并将session对象JSESSIONID使用cookie技术储存到浏览器中
- 保证用户的其他请求能够获取到同一个session对象,耶额能够保证不同的请求获取
- 到共享的对象
- 特点:
- 储存在服务器端
- 服务器进行创建
- 依赖于cookie技术
- 一次会话
- 默认储存时间是半小时
- 作用:
- 一个用户不同请求处理的数据共享问题
- 使用:
- 创建/获取session对象
- HttpSession hs=arg0.getSession();//即是创建也是获取
- 如果请求中拥有session的标识符JSESSIONID,则返回对应的sessionID
- 如果请求中没有session的标识符JSESSIONID,则创建新的session对象,
- 并将JSESSIONID作为cookie储存在浏览器端
- 如果session对象失效了,也会重新创建一个session对象, 并将JSESSIONID
- 作为cookie储存在浏览器端
- 设置储存时间:
-
hs.setMaxInactiveInterval(3*24*3600);
-
注意:
-
在指定时间内session对象没有被使用则销毁,如果使用了则重新计时
-
设置session强制失效:
-
hs.invalidate();
-
存储和获取数据:
-
存储: hs.setAttribute("name", name);
-
获取: hs.getAttribute("name");返回的数据类型为object,需要类型转化
-
注意:
-
储存的动作和去除的动作可以发生在不同的请求中,但是存储必须先于取出执行
-
使用时机:
-
一般用户在登陆web项目时会将用户的个人信息存储到session中,供该用户的其他请求使用
-
总结:
-
session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session
-
对象不失效的情况下
-
用户在任意请求中都能获得同一个session的对象
-
作用域:
-
一次会话
-
在JSESSIONID不失效和session对象不失效的情况下为整个项目内
-
session失效处理:
-
将用户请求中的JSESSONIOID和后台获取到的 对象JSESSONIOID进行对比,如果一致
-
则session没有失效,如果不一致则证明失效了,重定向到登陆页面,让用户重新登陆
- 解决主页面用户名显示为null的问题:
原因:
因为在用户登陆成功后使用重定向显示主页面,两次请求,而用户的信息
在第一次请求中,第二次请求中没有用户数据,所以显示为null
解决:
使用session - 注意:
- JSESSIONID储存在了cookie的临时储存空间中,浏览器关闭就消失
*/
public class sessionservlet extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//设置请求编码格式
arg0.setCharacterEncoding(“utf-8”);
//设置响应编码格式
arg1.setContentType(“text/html;charset=utf-8”);
//获取请求信息
String name=“王思伟”;
//处理请求信息
//创建session对象
HttpSession hs=arg0.getSession();//即是创建也是获取
System.out.println(hs.getId());
//储存数据
hs.setAttribute(“name”, name);
//响应处理结果
//直接响应
arg1.getWriter().write(“session 学习”);
}
}
package com.wang;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
-
servletcontext对象的学习:
-
问题:
-
不同的用户使用相同的数据
-
解决:
-
servletcontext对象
-
特点:
-
服务器创建
-
用户共享
-
作用域:
-
整个项目
-
生命周期:
-
服务器的启动到关闭
-
使用:
-
获取servletcontext的对象
-
使用servletcontext对象完成数据共享
-
//获取servletcontext对象 //第一种方式 ServletContext sc=this.getServletContext(); //第二种方式 ServletContext sc2=this.getServletConfig().getServletContext(); //第三种方式 ServletContext sc3=arg0.getSession().getServletContext(); //使用servletcontext完成数据共享 //数据存储 sc.setAttribute("str", "servletcontext学习"); //数据获取 sc.getAttribute("str"); 注意: 不同的用户可以给servletcontext对象进行数据的存取 获取的数据不存在返回null
获取项目中web.xml文件中的全局配置数据
sc.getInitParameter(“name”);根据键的名字返回所对应的值,string类型
sc.getInitParameterNames(); 返回键名的枚举
配置方式
wangsiwei
751612751612
注意:标签只能存储一组键值对数据,多组可以声明多个
进行存储
作用:
将静态数据和代码进行解耦
获取项目webcontent下的资源绝对路径
String path=sc.getRealPath( String path);
System.out.println(path);
获取的路径为项目根目录,path参数为项目根目录的路径
获取webcontent下的资源的流对象
InputStream is=sc.getResourceAsStream("/doc/1.txt");
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要类加载器
path参数为项目根目录的路径
*/
public class servletcontext extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//获取servletcontext对象
//第一种方式
ServletContext sc=this.getServletContext();
//第二种方式
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3=arg0.getSession().getServletContext();
//使用servletcontext完成数据共享
//数据存储
sc.setAttribute("str", "servletcontext学习");
//获取项目的web.xml的全局配置文件
String name=sc.getInitParameter("wangsiwei");
System.out.println("全局配置参数"+name);
arg1.getWriter().write(name);
//获取项目根目录下的资源的绝对路径
String path=sc.getRealPath("/doc/1.txt");
System.out.println(path);
//获取项目根目录下的资源的流对象
InputStream is=sc.getResourceAsStream("/doc/1.txt");
}
}
package com.wang;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
-
servletcontext对象的学习:
-
问题:
-
不同的用户使用相同的数据
-
解决:
-
servletcontext对象
-
特点:
-
服务器创建
-
用户共享
-
作用域:
-
整个项目
-
生命周期:
-
服务器的启动到关闭
-
使用:
-
获取servletcontext的对象
-
使用servletcontext对象完成数据共享
-
//获取servletcontext对象 //第一种方式 ServletContext sc=this.getServletContext(); //第二种方式 ServletContext sc2=this.getServletConfig().getServletContext(); //第三种方式 ServletContext sc3=arg0.getSession().getServletContext(); //使用servletcontext完成数据共享 //数据存储 sc.setAttribute("str", "servletcontext学习"); //数据获取 sc.getAttribute("str"); 注意: 不同的用户可以给servletcontext对象进行数据的存取 获取的数据不存在返回null
获取项目中web.xml文件中的全局配置数据
sc.getInitParameter(“name”);根据键的名字返回所对应的值,string类型
sc.getInitParameterNames(); 返回键名的枚举
配置方式
wangsiwei
751612751612
注意:标签只能存储一组键值对数据,多组可以声明多个
进行存储
作用:
将静态数据和代码进行解耦
获取项目webcontent下的资源绝对路径
String path=sc.getRealPath( String path);
System.out.println(path);
获取的路径为项目根目录,path参数为项目根目录的路径
获取webcontent下的资源的流对象
InputStream is=sc.getResourceAsStream("/doc/1.txt");
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要类加载器
path参数为项目根目录的路径
*/
public class servletcontext extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//获取servletcontext对象
//第一种方式
ServletContext sc=this.getServletContext();
//第二种方式
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3=arg0.getSession().getServletContext();
//使用servletcontext完成数据共享
//数据存储
sc.setAttribute("str", "servletcontext学习");
//获取项目的web.xml的全局配置文件
String name=sc.getInitParameter("wangsiwei");
System.out.println("全局配置参数"+name);
arg1.getWriter().write(name);
//获取项目根目录下的资源的绝对路径
String path=sc.getRealPath("/doc/1.txt");
System.out.println(path);
//获取项目根目录下的资源的流对象
InputStream is=sc.getResourceAsStream("/doc/1.txt");
}
}
package com.wang;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
- servletconfig对象的学习
-
问题:
-
如何获取在web.xml中给每个servlet单独配置数据4
-
解决:
-
使用servletconfig对象
-
使用:
-
获取servletconfig对象
-
获取web.xml中的配置数据
*/
public class servletconfig extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
//获取servletconfig对象
ServletConfig sc=this.getServletConfig();
//获取web.xml中的配置数据
String str=sc.getInitParameter("config");
System.out.println(str);
}
}
在web项目中和tomcat服务器下都有web.xml文件
区别:
web项目下的web.xml文件为局部配置,针对本项目的位置
tomcat下的web.xml文件为全局配置,配置公共信息
如果自己的项目和服务器都配了的配置,有限使用自己的
内容:
全局上下文配置(全局参数)
servlet配置
过滤器配置
监听器配置
注意:
他们的配置没有先后顺序,加载有先后顺序
加载顺序:
web容器会按servletcontext–>context-param–>listener–>filter–>
servelt这个顺序加载组件
加载时期:
都是服务器启动的时候
热部署和冷部署:
热部署
修改项目的内容不需要重启服务器,也不需要将项目部署放在tomcat的webroot下
将这句话放在
server.xml的host里
冷部署
每一次修改需要重启服务器
JSP的学习:
问题:
使用servle响应请求的时候,将响应的代码打印出来比较麻烦
工作量太大,使用html的话数据一般是静态的,servlet响应的
网页为动态网页
解决:
使用JSP技术(保留servlet优点的同时可以像写html代码那样方便)
概念:
一种动态网页技术
特点:
本质还是servlet
跨平台,一次编写处处运行
组件跨平台
健壮性和安全性
原理:
将普通的html的文本进行转义,让servlet可以识别运行
JSP的语法和指令:
JSPD的三种注释:
前端语言注释:
会被转义,也会被发送,但是不会被浏览器执行
Java语言注释:
会被转义,但是不会被servlet执行
jsp注释:
不会被转义
JSP的page指令学习:
<%@ page 属性名=“属性值”属性名=“属性值”"%>
language:声明jsp要被转义的语言
import:声明转义的java文件要导入的包,不同的包使用逗号隔开
pageEncoding:设置jsp文件的数据编码格式
contentType="text/html; charset=utf-8"设置jsp数据响应给浏览器时,
浏览器的解析和编码格式
session:设置转译的servlet中是否开启session支持,默认是开启的
errorpage:设置jsp页面运行错误的时候跳转的页面
extends:设置jsp转译的Java文件要继承的父类
作用:
配置jsp文件的转译相关的参数
JSP的局部代码块:
特点:
局部代码鲁艾中声明的java代码会被原样转译到jsp对应的servlet
文件的_jspservice方法中
代码块声明的变量都是局部变量
使用:
<% java代码 %>
缺点:
使用局部代码块在jsp中进行逻辑判断,书写麻烦,阅读困难
开发:
使用servlet进行请求逻辑处理,使用jsp进行页面展现
JSP的全局代码块:
特点:
声明的java代码作为全局代码转译到对应的servlet类中
使用:
<%! 全局代码 %>
注意:
全局代码块声明的代码,需要使用局部代码块来调用
JSP的脚本段语句:
特点:
帮助我们快速的获取变量或者方法的返回值作为数据响应给浏览器
使用:
<%=变量名或者方法的返回值%>
注意:不要再变量名或方法名后加分号
位置:除jsp语法要求以外都可以加