8. 使用继承GenericServlet类的方法来开发Servlet
这个类是javax.servlet包中的一个类,提供这个类简化了servlet的开发
在继承了GenericServlet类的子类中,只需要重写service方法即可,也就是要重写实现用户自己业务逻辑的函数方法。
与实现Servlet接口类似,也是打印一个“Hello world”。
具体的代码如下:
// 这是第二中开发Servlet的方法(通过继承GenericServlet开发)
package com.tsinghua;
import javax.servlet.GenericServlet;
import java.io.*;
import javax.servlet.*;
public class HelloGen extends GenericServlet
{
// 重写service方法即可
public void service(ServletRequest req, ServletResponse res)
{
// 返回Hello world
try{
PrintWriter pw = res.getWriter();
pw.println("Hello world! Generic");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
Servlet的配置类似于实现Servlet接口的配置。在web.xml中加入相应的servlet配置代码即可。
9. 通过继承HttpServlet开发Servlet方法:
通过继承HttpServlet去开发Servlet方法,需要重写doGet(),doPost()方法。这是目前用的比较多的一种方法。
表单提交数据的get请求和post请求的区别:
1. 从安全性来讲,get < post get的数据会在浏览器的地址栏显示
2. 从提交内容的大小来看,get < post 理论说get提交的数据不能大于2K,post在理论上不受限制,但是我们实际编程中一般不要大于64K。
3. 从响应速度上看,get > post,get要求服务器立即处理请求。而post请求可能形成一个队列请求。
与继承GenericServlet 类类似,继承HttpServlet类,要重写相应的一些方法。doGet和doPost方法。
从doGet和doPost方法的参数可以知道,它们实现的功能是相同的,仅仅是使用不同的函数名字。这样就可以在doGet方法中调用this.doPost(req, res); 或者相反在doPost中调用this.doGet(req, res);方法。例如第二种,这样仅仅需要在doGet方法中实现相应的业务逻辑即可。
这种方法的代码如下所示:
// 这是第三种开发servlet的方法(通过继承HttpServlet类来实现)
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
public class HelloHttp extends HttpServlet
{
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doGet( HttpServletRequest req, HttpServletResponse res)
{
// 业务逻辑在此处书写
try{
PrintWriter pw = res.getWriter();
pw.println("Hello world! Http");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doPost( HttpServletRequest req, HttpServletResponse res)
{
this.doGet( req, res);
}
}
本servlet的配置方法与上面相同。其中不需要重复启动tomcat,只需要在tomcat的管理员页面中重新加载你的工程即可。
10. Servlet开发实例
简单的用户登陆网站(Servlet版本1),主要实现用户验证功能
知识点:
1. 如何使用servlet开发动态网页
2. 如何从一个页面跳转到另外一个页面。
用户登录网站(Sevlet版本1.0)框架处理
具体的开发则是书写Login.java LoginCl.java和Wel.java文件。
在LoginCl.java中做一个用户信息的验证,如果成功则转向welcome页面。
其中碰到的两个问题:
1. 乱码的处理:
在使用res参数返回页面信息之前,调用res.setContentType("text/html;charset=gbk");来设置字符集。使用gbk就不会出现乱码了。
2. 页面的跳转:
页面的跳转是通过res的res.sendRedirect("welcome");方法来实现。
具体实现代码如下:
// 登录界面
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet
{
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doGet( HttpServletRequest req, HttpServletResponse res)
{
// 业务逻辑在此处书写
try{
// 中文乱码解决方法
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
// 返回登录界面
pw.println("<html>");
pw.println("<body>");
pw.println("<form action=loginhandle method=post>");
pw.println("用户名:<input type=text name=username><br>");
pw.println("密码:<input type=password name=passwd><br>");
pw.println("<input type=submit value=loing><br>");
pw.println("</form>");
pw.println("</body>");
pw.println("</html>");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doPost( HttpServletRequest req, HttpServletResponse res)
{
this.doGet( req, res);
}
}
LoginHandle的代码:
// 用户验证servlet
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
public class LoginHandle extends HttpServlet
{
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doGet( HttpServletRequest req, HttpServletResponse res)
{
// 业务逻辑在此处书写
try{
// 接收用户的信息,用户名和密码
String u = req.getParameter("username");
String p = req.getParameter("passwd");
// 验证
if(u.equals("sp") && p.equals("123"))
{
// 合法
// 跳转
res.sendRedirect("welcome");
}
else
{
// 不合法
// 跳转
res.sendRedirect("login"); // 这里的参数要跳转到的Servlet的URL
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doPost( HttpServletRequest req, HttpServletResponse res)
{
this.doGet( req, res);
}
}
Welcome的源代码:
// 欢迎界面
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
public class Welcome extends HttpServlet
{
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doGet( HttpServletRequest req, HttpServletResponse res)
{
// 业务逻辑在此处书写
try{
PrintWriter pw = res.getWriter();
pw.println("Wel, hello!");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
// 处理get请求
// req:用于或得客户端的信息
// res:用于向客户端返回信息
public void doPost( HttpServletRequest req, HttpServletResponse res)
{
this.doGet( req, res);
}
}
配置文件如前面所述,详细代码如下:
<!-- JSPC servlet mappings start -->
<!—Login 配置 -->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.tsinghua.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!—LoginHandle 配置 -->
<servlet>
<servlet-name>loginhandle</servlet-name>
<servlet-class>com.tsinghua.LoginHandle</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginhandle</servlet-name>
<url-pattern>/loginhandle</url-pattern>
</servlet-mapping>
<!-- Welcome配置 -->
<servlet>
<servlet-name>welcome</servlet-name>
<servlet-class>com.tsinghua.Welcome</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>welcome</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<!-- JSPC servlet mappings end -->
By 北洋小郭
转载请注明出处,请勿用于商业用途,谢谢!