您的位置:首页 > 理论基础 > 计算机网络

Java Web Servlet GenericServlet HttpServlet-Servlet(下)

2018-01-04 14:34 357 查看
一、

ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。

(1)getWriter():返回PrintWriter对象,调用该对象的print()方法,将把print()中的参数直接打印到客户的浏览器上。

(2)设置响应的内容类型:

response.setContentType("application/msword");        //response返回word类型

(3)void sendRedirect(Stringlocation):请求的重定向。(此方法为HttpServletResponse中定义)

二:

GenericServlet:

1、是一个Servlet。是Servlet接口和ServletConfig接口的实现类,但是一个抽象类。其中的service方法为抽象方法。

2、如果新建的Servlet程序直接继承GenericServlet会使开发更简洁。

3、具体实现

/**
 * 自定义的一个Servlet接口的实现类:让开发的任何Servlet都继承该类,以简化开发
 * @authorstephone
 */
publicabstractclass MyGenericServletimplements
Servlet,ServletConfig{
    /*以下方法为Servlet接口的方法*/
    @Override
    publicvoid destroy() {}
    @Override
    public ServletConfig getServletConfig() {
       //TODO Auto-generatedmethod stub
       returnservletConfig;
    }
    private ServletConfigservletConfig;
    @Override
    public String getServletInfo() {
       returnnull;
    }
    @Override
    publicvoid init(ServletConfigarg0)
throws ServletException {
       this.servletConfig =arg0;
       init();
    } 
    //初始化
    publicvoid init() throws
ServletException{
    }
 
    @Override
    publicabstractvoid service(ServletRequestarg0,
ServletResponsearg1)
           throws ServletException, IOException;
    /*以下方法为ServletConfig接口的方法*/
    @Override
    public String getInitParameter(Stringarg0) {
       returnservletConfig.getInitParameter(arg0);
    }
    @Override
    public Enumeration<String> getInitParameterNames() {
       returnservletConfig.getInitParameterNames();
    }
    @Override
    public ServletContext getServletContext() {
       returnservletConfig.getServletContext();
    }
    @Override
    public String getServletName() {
       returnservletConfig.getServletName();
    }
}

(1)在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化。

(2)利用servletConfig成员变量的方法实现了ServletConfig接口的方法

(3)还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化。

(4)不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(ServletConfig),而还是用了ServletConfig接口的方法,则会出现空指针异常。

(5)新建的init(){}并非Servlet的生命周期方法,而init(ServletConfig)是生命周期相关的方法.

(6)GenericServlet接口图



三、HttpServlet

(1)是一个Servlet,继承自GenericServlet,针对于HTTP协议所定制

(2)在service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse,并调用了重载的service(HttpServletRequest,HttpServletResponse)

在service(HttpServletRequest,HttpServletResponse)获取了请求方式:request.getMethod(),根据请求方式又创建了doXxx()方法(xxx为具体的请求方式,比如doGet,doPost),具体实现:

publicclass MyHttpServletextends MyGenericServlet
{
    @Override
    publicvoid service(ServletRequestarg0,
ServletResponsearg1)
           throws ServletException, IOException {
       if(arg0instanceof
HttpServletRequest)
       {
           HttpServletRequest request = (HttpServletRequest)arg0;
           if(arg1instanceof
HttpServletResponse)
           {
              HttpServletResponse
response = (HttpServletResponse)arg1;
              service(request,response);
           }
       }
    }
   
    publicvoid service(HttpServletRequestrequest,
HttpServletResponseresponse)
           throws ServletException, IOException {
       //1、获取请求方式
       String method =request.getMethod();
       //2、根据请求方式再调用对应的处理方法
       if("GET".equalsIgnoreCase(method))
       {
           doGet(request,response);
       }elseif("POST".equalsIgnoreCase(method))
       {
           doPost(request,response);
       }
    }
 
    publicvoid doPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throws IOException {
       //TODO Auto-generatedmethod stub
    }
 
    publicvoid doGet(HttpServletRequestrequest,
HttpServletResponseresponse) {
       //TODO Auto-generatedmethod stub
    }
 
}

(3)实际开发中,直接继承HttpServlet,并根据请求方式复写doXxx()方法接口。

(4)优点:直接有针对性的覆盖doXxx()方法;直接使用HttpServletRequest和HttpServletResponse,不再需要强转。

四、HttpServlet

例:在MySQL数据库中创建一个user数据表,添加3个字段:id,username,password,并录入;定义一个login.html,里边定义两个请求字段:user,password。发送请求到loginServlet,在创建一个LoginServlet(需要继承自HttpServlet,并重写其doPost方法),在其中获取请求的user,password。;利用JDBC从test_users中查询有没有和页面输入的user,password对应的记录,SELECTcount(id) FROM
test_users WHERE user = ? AND password = ? 若有,响应Hello,xxx,否则,Sorry,xxx。

public class LoginServlet3 extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");

java.sql.Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;

String sql = "SELECT count(id) FROM user WHERE username = ?" + "AND password = ?";
PrintWriter out = resp.getWriter();

try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///myway";
String user = "root";
String password2 = "root";
connection = DriverManager.getConnection(url, user, password2);
statement = ((java.sql.Connection) connection).prepareStatement(sql);

statement.setString(1, username);
statement.setString(2, password);

resultSet = statement.executeQuery();

if(resultSet.next())
{
int count = resultSet.getInt(1);

if(count>0)
{
out.print("Hello:"+username);
}else {
out.print("Sorry:"+username);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(resultSet != null)
{
resultSet.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(statement != null)
{
statement.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(connection != null)
{
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
注:最后实例涉及到JDBC编程,只需将JDBC的jar包驱动拷贝到lib目录下即可,涉及到的资源的链接为:链接:https://pan.baidu.com/s/1jIEf3YA 密码:ewcs;其中SQLyog安装教程链接为:http://blog.csdn.net/lihua5419/article/details/73881837
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐