基本功训练Servlet技术.docx
《基本功训练Servlet技术.docx》由会员分享,可在线阅读,更多相关《基本功训练Servlet技术.docx(19页珍藏版)》请在冰豆网上搜索。
基本功训练Servlet技术
同学们,这些小例题虽然很简单,但是可以锻炼一下大家对于本节课相关小模块的思维能力。
这都是按照我自己的习惯手打出来的,很多都是我自己风格的代码直接复制过来的,可能很多同学看着会不习惯。
希望大家好好看看,不要求你一个字一个字去读,只要你能理解每道题目中含有什么信息,以后遇到了这样一个情境能会去运用就行。
其中,红色的标出的部分一般是这个小模块是干嘛的,类似于题目要求,意思就是当你看到以后,能有个条件反射应该怎么实现。
黑色加粗是需要了解的概念,黄色部分是拓展,表格里面的是源代码,你们并不需要刻意去跟我写得一样,只要这些功能你们能自己实现就行了。
千万不要把程序写死了哈,最后希望我跟同学们一起学习,共同进步。
既然选择了远方,就注定风雨兼程。
――――――― 写在前面
基本功训练一:
在Servlet中实现请求转发
在实际的网站开发中,请求转发是最常见的,在Servlet中实现页面转发,使用的是RequestDispatcher对象的forward()方法。
可以在Servlet中通过forward()方法将当前的请求转发到其他web组件(Servlet、JSP、HTML)。
下面的例子关键点是如何在Servlet中控制请求转发,在文本框中输入用户名和密码,单击“登录按钮,如果用户名和密码输入正确则页面转发到成功页,否则页面将跳转到失败页。
运行结果如下图所示:
图1-1 登陆页面
图1-2成功页
图1-3失败页
关键代码:
1)index.jsp
用户名: | |
密码: | |
|
2)ForwardServlet关键代码:
publicclassForwardServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");//设置请求的字符编码格式
Stringname=request.getParameter("name");//获得请求表单中的用户名
Stringpwd=request.getParameter("pwd");//获得请求表单的密码
if((name!
=null&&!
name.equals(""))&&(pwd!
=null&&!
pwd.equals(""))){
if(name.equals("zhaoyanliang")&&pwd.equals("123")){
request.getRequestDispatcher("success.jsp").forward(request,
response);//使用RequestDispatcher对象将页面请求转发到success.jsp页
}else{
request.getRequestDispatcher("error.jsp").forward(request,
response);
}
}else{
}
}
}
3)web.xml关键代码:
ForwardServlet
cn.itcast.servlet.ForwardServlet
ForwardServlet
/forward
【思维扩展】当在Servlet中验证用户名和密码失败时,将页面跳转到index.jsp首页面。
也可以在错误页中定义一个变量,根据变量值的不同来判定显示结果。
基本功训练二:
在Servlet中处理表单提交的数据
JavaWeb的核心组件Servlet的主要功能就是处理客户端的表单请求数据,然后再Servlet中首先对这些数据进行验证,然后可能会封装到JavaBean,接下来调用数据库的业务逻辑方法将数据保存或者进行其他操作,最后Servlet控制将响应结果返回到客户端。
运行程序,结果如图所示,输入用户注册信息提交后,在Servlet中将获取这些表单请求信息,然后通过forward()方法将这些请求信息转发,最后在转发页中显示出这些信息。
图2-1获取用户信息界面
图2-2在Servlet中获取表单提交的数据
关键代码:
1)index.jsp表单关键代码:
用户名: | |
密码: | |
性别: | 男 女 |
年龄: | |
Email: | |
|
2)LoginServlet关键代码:
publicclassLoginServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("GBK");//设置请求的字符编码格式
Stringname=request.getParameter("name");//获得用户名
Stringpwd=request.getParameter("pwd");//获得密码
Stringsex=request.getParameter("sex");//获得性别
Stringage=request.getParameter("age");//获得年龄
Stringemail=request.getParameter("email");//获得Email
request.getRequestDispatcher("logininfo.jsp").forward(request,response);
}
}
3)logininfo.jsp
用户名: | <%=request.getParameter("name")%> |
密码: | <%=request.getParameter("pwd")%> |
性别: | <%=request.getParameter("sex")%> |
年龄: | <%=request.getParameter("age")%> |
Email: | <%=request.getParameter("email")%> |
【注意】本实例知识为了说明如果在Servlet中处理表单提交的数据,并没有实现数据的保存或更新操作。
而实际上在Servlet中处理完表单数据后,通常会根据表单数据更新数据库,最后再由Servlet进行控制转发操作。
【思维扩展】在以上程序实现的基础上,在Servlet中获取表单数据后,将数据保存在数据库中。
基本功训练三:
在servlet中实现页面重定向
下面的例子将演示如何在Servlet中实现页面重定向。
实现页面重定向主要应用在HttpServletResponse对象的sendRedirect()方法,该方法与页面转发的forward()方法有本质的区别。
使用forward()方法时,会将当前正在处理的请求转发到其他Web组件(Servlet、JSP、HTML),如将请求转发到index.jsp页,在index.jsp页中可以通过request内置对象来获得此请求。
而sendredirect()方法不会转发请求,知识简单地页面跳转。
运行程序,结果如下图显示,当用户输入的用户名或密码输入错误时,提交表单后在Servlet中会进行判断,然后将页面重定向到错误页。
图3-1在Servlet中实现页面重定向
图3-1用重定向实现跳转到错误页面
关键代码:
1)index.jsp
用户名: | |
密码: | |
|
2)RedirectServlet关键代码:
publicclassRedirectServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");//设置请求数据的字符编码格式
Stringname=request.getParameter("name");//获得请求表单中的用户名
Stringpwd=request.getParameter("pwd");//获得请求表单中的密码
if((name!
=null&&!
name.equals(""))&&(pwd!
=null&&!
pwd.equals(""))){
if(name.equals("mr")&&pwd.equals("123")){
//使用SendRedirect()方法将页面重定向到success.jsp
response.sendRedirect("success.jsp");
}else{
//使用SendRedirect()方法将页面重定向到error.jsp
response.sendRedirect("error.jsp");
}
}
}
}
【思维扩展】在以上程序的基础上,实现在Servlet中如果验证成功,将用户名保存在session中,然后将页面重定向到success.jsp页,并在该页中显示出登录的用户名。
基本功训练四:
动态生成HTML文档
在实际开发过程中,有时需要直接在Servlet中将数据的处理结果直接反馈给客户端浏览器,这就需要通过Servlet来生成HTML内容。
下面的例子将涉及到如何在Servlet类中动态生成一个HMTL页面,运行结果如下图所示:
图4-1使用Servlet动态生成的HTML页的内容
查看其源文件
关键代码:
publicclassServletHTMLextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//设置响应的字符集格式为UTF-8
response.setCharacterEncoding("UTF-8");
//设置响应正文的MIME类型
response.setContentType("text/html");
//返回一个PrintWriter对象,Servlet使用它来输出字符串形式的正文数据
PrintWriterout=response.getWriter();
//以下为输出的HTML正文数据
out.println("
DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">");
out.println("");
out.println("
动态生成HTML文档");
out.println("");
out.println("");
out.println("
");
out.println("");
out.println("
动态生成HTMl文档 |
");
out.println("
表格 |
");
out.println("");
out.println("");
out.println("");
out.flush();
out.close();
}
}
这样,关于web.xml大家应该都会配了,也不用我多说了。
【思维扩展】在Servlet中动态生成HTML文档,并应用Javascript的alert()方法弹出一个提示框。
【注意】Javascript的弹出提示框代码要求在Servlet中生成。
基本功训练五:
在Servlet中向客户端写Cookie信息
以下的例题将涉及到如何向客户端写Cookie信息,运行结果如下图所示。
输入用户名和密码提交到Servlet中,在Servlet中将用户名添加到Cookie对象中,然后关闭浏览器,在重新访问用户登录页时,用户名的文本框中会显示上一次输入的用户名信息。
本程序的实现主要是应用ServletAPI中提供的Cookie类。
用户把表单信息提交给Servlet后,在Servlet中获取用户请求的信息并添加到Cookie对象中,再通过HttpServletResponse对象把Cookie信息返给客户端,然后在JSP页面中通过request内置对象来获取客户端的Cookie信息。
在JSP中使用request对象获取的是一个Cookie对象的数组,需要在循环体中遍历所有的Cookie对象,并通过Cookie对象的getName()方法查找所有Cookie对象的名称,然后根据找到的Cookie名称获得Cookie对象中的值。
Cookie类中包含的主要方法及说明如下图表示:
方 法
说 明
GetComment()/setComment(Stringpurpose)
获取/设置Cookie的注释
getDomain()/setDomain(Stringparrern)
获取/设置Cookie的适用域。
一般Cookie只返回给与发送它的服务器名字完全相同的服务器
getMaxAge()/setMaxAge(intexpiry)
获取/设置Cookie过期之前的时间。
以秒为单位。
如果不设置该值,则Cookie只在当前会话内有效,即在用户关闭浏览器之前有效。
getName()/setName(Stringname)
获取/设置Cookie的名字
getValue()/setValue(StringnewValue)
获取/设置Cookie的值
getPath()/setPath(Stringuri)
获取/设置Cookie适用的路径。
如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面
getVersion()/setVersion(intv)
获取/设置Cookie所遵从的协议版本,默认版本为0
表一 Cookie类的主要方法及说明仅供参考
实现过程如下:
1)index.jsp
用户名: |
|
密码: | |
|
2)CookieServlet
publicclassCookieServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");
Stringname=request.getParameter("name");//获取用户名
//创建一个Cookie对象,并将用户名保存到Cookie对象中
CookienameCookie=newCookie("userName",name);
//设置Cookie过期之前的时间,单位为秒
nameCookie.setMaxAge(60);
//通过response的addCookie()方法将此Cookie对象保存到客户端浏览器的Cookie中
response.addCookie(nameCookie);
request.getRequestDispatcher("success.jsp").forward(request,response);
}
}
3)在index.jsp中读取所有客户端的Cookie,通过循环Cookie数组找到保存用户名的Cookie,关键代码:
<%
StringuserName=null;//用于保存从cookie中读取出的用户名
CookiecookieArr[]=request.getCookies();//获取客户端的所有Cookie
if(cookieArr!
=null&&cookieArr.length>0){
for(Cookiec:
cookieArr){
if(c.getName().equals("userName")){//如果Cookie中有一个名为
userName的Cookie
userName=c.getValue();//获得此cookie的值
}
}
}
%>
4)将获取到的用户名Cookie的值赋值给用户名文本框。
关键代码:
=null){out.print(userName);}%>"/>
【注意】 以上程序存在一个Bug,当输入中文提交时程序会发生异常,请同学们自行解决。
【提示】在创建Cookie对象时,由于不可以直接将中文字符作为Cookie的值,因此在将中文字符保存到Cookie对象之前,应该使用.URLEncoder类的encode()方