实验01 掌握Servlet的生命周期.docx
- 文档编号:17691114
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:19
- 大小:51.95KB
实验01 掌握Servlet的生命周期.docx
《实验01 掌握Servlet的生命周期.docx》由会员分享,可在线阅读,更多相关《实验01 掌握Servlet的生命周期.docx(19页珍藏版)》请在冰豆网上搜索。
实验01掌握Servlet的生命周期
Lecture01_Servlet
目的:
掌握Servlet的生命周期
1创建一个基本的Servlet1
2,编写与HTML表单交互的Servlet2
3.Servlet中常用的操作4
4测试应用ServletContext实现两个Servlet之间的通信5
5Session和Cookie对象7
6用Servlet实现上课签到应用8
1创建一个基本的Servlet
1>.创建WEB项目,名为Lecture01_Servlet,使用默认的服务器Glassfishv2,不选择框架。
2>.新建一个Servlet
a>指定类名为ServletBasic
b>按如下图指定Servlet的内部对象名称和外部访问URL模式
c>完成
3>.打开项目中WEB-INF文件夹下的web.xml,可以看到以下内容:
…
…
注意它与以上向导操作的对应关系。
取消ServletBasic类中的注解,运行项目。
默认浏览器将被启动,服务器中的index.jsp页面将被运行
在浏览器中输入:
http:
//localhost:
8080/lecture01_Servlet/myServlet
在页面中将看到输出内容:
ServletServletBasicat/lecture01_Servlet
注意:
所输入的http:
//localhost:
8080/lecture01_Servlet/myServlet中
myServlet是执行ServletBasic的URL用名称,lecture01_Servlet是站点路径名,前面部分http是协议名、localhost是主机名,8080是端口号。
2,编写与HTML表单交互的Servlet
右选项目名:
新建HTML文件,输入HTML文件名login
编辑login.html,将其中的body区替换为:
用户名:
口令:
建立一个新的Servlet类名为ServletLogin,用于接收和处理该表单中输入的用户名和口令值。
设置相应的URL为loginservlet。
相应的processRequest方法代码为:
protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
Stringname=request.getParameter("name");
Stringpassword=request.getParameter("password");
try{
out.println("");
out.println("
");out.println("
out.println("");
out.println("
");out.println("
Hello"+name+",welcome!
");
out.println("
Iknowyourpassowrdis"+password+"
");out.println("");
out.println("");
}finally{
out.close();
}
}
3.Servlet中常用的操作
获得HTTP请求信息
创建第三个Servlet,类名为ServletHttpRequest,URL访问名为myHttpRequestServlet
将processRequest方法内容修改为:
protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
try{
Enumeratione=request.getHeaderNames();//请求头名枚举
while(e.hasMoreElements()){//列出所有请求头属性值
Stringname=(String)e.nextElement();
Stringvalue=request.getHeader(name);
out.println(name+"="+value+"
");
}
}finally{
out.close();
}
}
accept=*/*
accept-language=zh-cn
accept-encoding=gzip,deflate
user-agent=Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;(R11.6);.NETCLR2.0.50727;360SE)
host=localhost:
8080
connection=Keep-Alive
cookie=JSESSIONID=74a165c8774090fdba94a8534575
运行:
http:
//localhost:
8080/lecture01_Servlet/myHttpRequestServlet
输出结果为:
通过request对象获得其它请求信息:
Method,RequestURI,Protocol,PathInfo,RemoteAddr
向ServletHttpRequest类的processRequest方法中加入以下代码:
out.println("请求方法Method:
"+request.getMethod()+"
");
out.println("授权类型AuthType:
"+request.getAuthType()+"
");
out.println("请求URI,RequestURI:
"+request.getRequestURI()+"
");
out.println("请求协议Protocol:
"+request.getProtocol()+"
");
out.println("远程用户RemoteUser:
"+request.getRemoteUser()+"
");
out.println("访问源地址,RemoteAddr:
"+request.getRemoteAddr()+"
");
out.println("会话ID,RequestedSessionId:
"+request.getRequestedSessionId()+"
");
运行,将得到以下输出结果:
请求方法Method:
GET
授权类型AuthType:
null
请求URI,RequestURI:
/lecture01_Servlet/myHttpRequestServlet
请求协议Protocol:
HTTP/1.1
远程用户RemoteUser:
null
访问源地址,RemoteAddr:
127.0.0.1
会话ID,RequestedSessionId:
753fbed2de0300cfece11b32525e
4测试应用ServletContext实现两个Servlet之间的通信
利用一个项目中唯一的共享上下文ServletContext对象实现两个或多个Servlet之间的通信。
1>覆盖ServletBasic父类中的init方法,在该方法中向ServletContext中写入两个属性—值对。
//覆盖init方法
publicvoidinit()throwsServletException{
ServletContextctx=this.getServletContext();//取得Servlet运行环境的上下文对象
ctx.setAttribute("ServletBasic_name","ServletBasic");//向运行环境写入一个属性和相关的值
ctx.setAttribute("ServletBasic_description","myfirstServlet");
}
2>创建另一个Servlet,类名为:
ServletSecond,URL访问名为mySecondServlet
3>对ServletSecond的processRequest方法中加入代码:
//测试Servlet之间的通信
ServletContextctx=this.getServletContext();//取得Servlet运行环境的上下文对象
Stringname=(String)ctx.getAttribute("ServletBasic_name");
Stringdesc=(String)ctx.getAttribute("ServletBasic_description");
去除原有的注释,加入以下两行:
out.println("
自SevletBasic读取的属性:
ServletBasic_name="+name+"");
out.println("
自SevletBasic读取的属性:
ServletBasic_description="+desc+"");
4>运行项目
自SevletBasic读取的属性:
ServletBasic_name=Null
自SevletBasic读取的属性:
ServletBasic_description=Null
先运行http:
//localhost:
8080/lecture01_Servlet/mySecondServlet,输出结果为:
说明此时并没有两个属性的值。
运行:
http:
//localhost:
8080/lecture01_Servlet/myServlet
再次运行:
http:
//localhost:
8080/lecture01_Servlet/mySecondServlet,输出结果为:
自SevletBasic读取的属性:
ServletBasic_name=ServletBasic
自SevletBasic读取的属性:
ServletBasic_description=myfirstServlet
说明运行myServlet后,所设置的属性信息被mySeondServlet所取得。
讨论与思考:
1.这种基于共享上下文的信息交换功能有什么用?
可以用它解决哪些问题?
2.聊天程序?
5Session和Cookie对象
创建一个Servelt,类名为ServletSession,访问URL为mySessionServlet
processRequest代码为:
protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
HttpSessionsession=request.getSession();//取得Session对象
try{
DatedateCreate=newDate(session.getCreationTime());
DatedateAccess=newDate(session.getLastAccessedTime());
out.println("SessionID="+session.getId()+"
");
out.println("CreateDateTime="+dateCreate+"
");
out.println("LastAccessedDateTime="+dateAccess+"
");
session.setAttribute("userName","lxy");//向Session中设置属性
session.setAttribute("passWord","1234");//
//输出所有的Session值和名
EnumerationattriNames=session.getAttributeNames();//取得Session中的全部属性
while(attriNames.hasMoreElements()){//输出属性和值
StringatName=(String)attriNames.nextElement();
StringatValue=(String)session.getAttribute(atName);
out.println("Session属性名:
"+atName+",值="+atValue+"
");
}
}finally{
out.close();
}
}
创建一个Servelt,类名为ServletCookies,访问URL为myCookiesServlet
processRequest代码为:
protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
Cookie[]cookies=request.getCookies();
for(Cookiec:
cookies){
Stringcname=c.getName();
Stringcvalue=c.getValue();
out.println(cname+"="+cvalue+"
");
}
//向cookies中添加属性
Cookiec1=newCookie("cookieAtt1","value1");
Cookiec2=newCookie("cookieAtt2","value2");
response.addCookie(c1);
response.addCookie(c2);
out.close();
}
运行http:
//localhost:
8080/lecture01_Servlet/myCookiesServlet
注意:
第一次运行,与第二次运行的区别
思考与讨论:
对上述Servlet可以作什么样的修改,得到一些有趣、有用的功能?
6用Servlet实现上课签到应用
实验内容:
1.在数据库中创建签到表
2.根据数据库创建实体类
3.根据实体类创建会话Bean
4.创建html页面,在表单中接收用户输入,提交到签到Servlet
5.创建签到Servlet,获取表单输入数据,应用会话Bean插入到数据库中。
实验步骤:
6.1.在数据库中创建签到表
在MySQL的test数据库中创建表signIn
CREATETABLE`signin`(
`stuNo`CHAR(10)NOTNULLDEFAULT'0',
`signDate`DATENOTNULLDEFAULT'0000-00-00',
`name`CHAR(20)NULLDEFAULTNULL,
`signTime`DATETIMENULL,
`signIP`CHAR(20)NULL,
PRIMARYKEY(`stuNo`,`signDate`))
6.2在WEB应用项目中基于数据库表创建实体类
得到如下所示的实体类SignIn.java
@Entity
@Table(name="signin")
@XmlRootElement
@NamedQueries({
@NamedQuery(name="Signin.findAll",query="SELECTsFROMSignins"),
@NamedQuery(name="Signin.findByStuNo",query="SELECTsFROMSigninsWHEREs.signinPK.stuNo=:
stuNo"),
@NamedQuery(name="Signin.findBySignDate",query="SELECTsFROMSigninsWHEREs.signinPK.signDate=:
signDate"),
@NamedQuery(name="Signin.findByName",query="SELECTsFROMSigninsWHEREs.name=:
name"),
@NamedQuery(name="Signin.findBySignTime",query="SELECTsFROMSigninsWHEREs.signTime=:
signTime"),
@NamedQuery(name="Signin.findBySignIP",query="SELECTsFROMSigninsWHEREs.signIP=:
signIP")})
publicclassSigninimplementsSerializable{
privatestaticfinallongserialVersionUID=1L;
@EmbeddedId
protectedSigninPKsigninPK;
@Size(max=20)
@Column(name="name")
privateStringname;
@Column(name="signTime")
@Temporal(TemporalType.TIMESTAMP)
privateDatesignTime;
@Size(max=20)
@Column(name="signIP")
privateStringsignIP;
publicSignin(){
}
publicSignin(SigninPKsigninPK){
this.signinPK=signinPK;
}
publicSignin(StringstuNo,DatesignDate){
this.signinPK=newSigninPK(stuNo,signDate);
}
publicSigninPKgetSigninPK(){
returnsigninPK;
}
publicvoidsetSigninPK(SigninPKsigninPK){
this.signinPK=signinPK;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicDategetSignTime(){
returnsignTime;
}
publicvoidsetSignTime(DatesignTime){
this.signTime=signTime;
}
publicStringgetSignIP(){
returnsignIP;
}
publicvoidsetSignIP(StringsignIP){
this.signIP=signIP;
}
@Override
publicinthashCode(){
inthash=0;
hash+=(signinPK!
=null?
signinPK.hashCode():
0);
returnhash;
}
@Override
publicbooleanequals(Objectobject){
//TODO:
Warning-thismethodwon'tworkinthecasetheidfieldsarenotset
if(!
(objectinstanceofSignin)){
returnfalse;
}
Signinother=(Signin)object;
if((this.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验01 掌握Servlet的生命周期 实验 01 掌握 Servlet 生命周期