servlet的一个小项目(二)

servlet的一个小项目(二)

ps:使用韩顺平老师的servlet的代码。

下面是三种开发servlet的方法。其实这个才应该是第一讲。

//这是我的第一个Serlvet,使用实现servlet接口的方式来开发


package com.tsinghua;

import javax.servlet.*;
import java.io.*;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class Hello implements Servlet {

    //该函数用于初始化该serlvet(类似于类的构造函数)
    //该函数只会被调用一次(当用户第一次访问该servlet时被调用)
    //这种方法也是最原始的方法,直接继承servlet,能看到控制servlet生命周期的几个函数
    //但是这几个生命周期是你的容器帮你调用的,比如tomcat
    public void init(ServletConfig parm1) throws ServletException {
        // TODO: Add your code here
        System.out.println ("init it");
    }

    //
    public ServletConfig getServletConfig() {
        // TODO: Add your code here
        return null;
    }

    //这个函数用于处理业务逻辑
    //程序员应当把业务逻辑代码写在这里
    //当用户每访问该servlet是,都会调用
    //req: 用于获得客户端(浏览器)的信息
    //res: 用于向客户端(浏览器)返回信息
    //res简直就是个奶妈,有啥函数啥要求什么的都是跟res去“点”
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // TODO: Add your code here

        System.out.println ("service it");
        //从res中得到PrintWriter
        PrintWriter pw=res.getWriter();
        pw.println("hello,world");
    }

    //
    public String getServletInfo() {
        // TODO: Add your code here
        return "";
    }

    //销毁servlet实例(释放内存)
    //1.reload 该serlvet(webApps) //2.关闭tomcat //3.关机
    public void destroy() {
        System.out.println ("destroy!");
        // TODO: Add your code here
    }

}

上面这个比较原始,下面有继承别的类去写servlet:

//这是第二种开发servlet的方法(继承GenericServlet开发)

package com.tsinghua;

import javax.servlet.GenericServlet;
import javax.servlet.*;

import java.io.*;

public class HelloGen extends GenericServlet{

    //重写service方法即可
    //那几个方法都给你写好了。这种方法曾经很火,不过现在都用下面的方法了:继承http那种。
    public void service (ServletRequest req,ServletResponse res){


        //返回hello,world! generic

        try {

            PrintWriter pw=res.getWriter();
            pw.println("hello,world! generic");
        }
        catch (Exception ex) {

            ex.printStackTrace();
        }

    }

}
//这是第三种开发servlet的方法(通过继承HttpServlet)


package com.tsinghua;

import javax.servlet.http.*;
import java.io.*;
import javax.servlet.*;

public class HelloHttp extends HttpServlet {


    //处理get请求
    //req: 用于获得客户端(浏览器)的信息
    //res: 用于向客户端(浏览器)返回信息
    //这个的框架更简单,就是http的两种请求方式,doGet和doPost。
    //下面这两种还是将两种方法合二为一。
    public void doGet(HttpServletRequest req,HttpServletResponse res){

        //业务逻辑 

        try {

            PrintWriter pw=res.getWriter();
            pw.println("hello,http");

        }
        catch (Exception ex) {

            ex.printStackTrace();
        }
    }

    //处理post请求
    //req: 用于获得客户端(浏览器)的信息
    //res: 用于向客户端(浏览器)返回信息
    public void doPost(HttpServletRequest req,HttpServletResponse res){

        this.doGet(req,res);

    }

}
//登录界面

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 bgcolor=#CED3FF>");

            //引用图片资源
            pw.println("<img src=imgs/1.GIF><hr><center>");
            //得到error信息。
            String info=req.getParameter("info");

            if(info!=null){
                pw.println("<h1>你的用户名或是密码错误!</h1><br>");
            }
            //下面这一堆是将html语言返回给浏览器的。这就显示出servlet的不好之处,乍看乱。
            pw.println("<h1>登录界面</h1>");
            //提交表单,跳转到loginCl,方式是post。
            pw.println("<form action=loginCl method=post>");
            //注意这个name的值,跳转到的那个目的地是按这个名字去接受的。
            pw.println("用户名:<input type=text name=usrename><br>");
            pw.println("密码:<input type=password name=passwd><br>");
            //<br>是换行
            pw.println("<input type=checkbox name=keep value=2>两周内不再重新登录<br>");
            pw.println("<input type=submit value=login><br>");
            pw.println("</form>");
            pw.println("</center><hr><img src=imgs/mylogo.gif>");
            pw.println("</body>");
            pw.println("</html>");

        }
        catch (Exception ex) {

            ex.printStackTrace();
        }
    }

    //处理post请求
    //req: 用于获得客户端(浏览器)的信息
    //res: 用于向客户端(浏览器)返回信息
    public void doPost(HttpServletRequest req,HttpServletResponse res){

        this.doGet(req,res);

    }
}
//用户验证servlet


//登录界面

package com.tsinghua;

import javax.servlet.http.*;

import java.io.*;
import java.sql.*;

public class LoginCl extends HttpServlet {


    //重写init函数

    public void init(){


        try {

            //只会被调用一次

            //创建一个FileReader
            //这个是测试servlet读取文件的。
            //这个挺神奇的吧,别人可以读取服务器上面的文件并进行修改了。txt的文件。
            FileReader  f=new FileReader("f:\\myCounter.txt");

            BufferedReader br=new BufferedReader(f);


            //读出一行数据    
            String numVal=br.readLine();

             //一定要关闭文件流     
            br.close();


            //将times值放入到servletcontext
            //用于测试访问次数的,这个要写到服务器的一个全局的变量“sevletcontent”中。这个也是一个两列的表。
            //因为访问一次访问次数只被加一次,所以写在init()中。
            this.getServletContext().setAttribute("visitTimes",numVal);

            System.out.println ("inti 被调用");
        }
        catch (Exception ex) {

            ex.printStackTrace();
        }

    }

    //重写destroy函数

    public void destroy(){

        try {


            //在将新的次数写会去
            FileWriter  fw=new FileWriter("f:\\myCounter.txt");

            BufferedWriter bw=new BufferedWriter(fw);

            //在文件中写入数据  
            bw.write(this.getServletContext().getAttribute("visitTimes").toString());

            //关闭文件流
            bw.close();


            System.out.println ("destroy 被调用");
        }
        catch (Exception ex) {

            ex.printStackTrace();

        }
    }
    //处理get请求
    //req: 用于获得客户端(浏览器)的信息
    //res: 用于向客户端(浏览器)返回信息
    //是不是看到了init()和destory()但是没看到service()有些奇怪?我也挺奇怪的。
    public void doGet(HttpServletRequest req,HttpServletResponse res){

        //业务逻辑 
        //因为要mvc,调用ConnDB的接口,先把这先写好。
        Connection ct=null;
        Statement sm=null;
        ResultSet rs=null;
        try {




            //接受用户名和密码
            //注意下面这个username一定要求和前面传过来的那个一致才行。
            String u=req.getParameter("usrename");
            String p=req.getParameter("passwd");

            //调用UserBeanCl,1.创建一个对象
            //这个结构对应表的结构。创建了一个业务Bean对象。
            UserBeanCl ubc=new UserBeanCl();


            //2.使用UserBeanCl的方法
            //这个比较省事,在loginCl中也不去调用和数据库有关的东西,都利用这个UserBeanCl去处理。
            //这个也是更细化了,省的loginCl中的方法太多,管的事儿太宽、
            if(ubc.checkUser(u,p)){

                    //合法用户
                    //如果是合法用户,则去查看“两周内自动登录”是否选中。

                    String keep=req.getParameter("keep");


                    if(keep!=null){
                    //如果是选中的,则
                    //将用户名和密码保存在客户端(cookie)
                    //创建
                    Cookie name=new Cookie("myname",u);
                    Cookie pass=new Cookie("mypasswd",p);

                    //设置时间 
                    //14天每天24小时每小时3600秒
                    //要命,这个函数接受的参数是秒啊秒啊秒啊
                    name.setMaxAge(14*24*3600);
                    pass.setMaxAge(14*24*3600);

                    //回写到客户端

                    res.addCookie(name);
                    res.addCookie(pass);

                }




                //将用户名和密码放入到session中
                //写在session中,同一个用户登录之后切换界面不用再登录。
                HttpSession hs=req.getSession(true);
                //这个参数是分钟。
                hs.setMaxInactiveInterval(30);
                //将用户名写到session中。
                hs.setAttribute("uname",u);

                //将serlvetContext中的 visitTime所对应的值++
                String times=this.getServletContext().getAttribute("visitTimes").toString();

                //对times++再重新放回servlet
                this.getServletContext().setAttribute("visitTimes",(Integer.parseInt(times)+1)+"");


                //跳转到wel
                //主界面,前提是通过了,这里面有些额外的方法比如保持两周内自动登录和记录网站的访问量,
                //都是在判断用户合法并之后进入的
                res.sendRedirect("Main");

            }else{

                //不合法

                //跳转
                res.sendRedirect("login");
                //写你要到的servlet的那个url
                //返回登录界面
            }

        }
        catch (Exception ex) {

            ex.printStackTrace();
        }finally{
        //这里面的关闭资源一定要用。

            try {

                if(rs!=null){

                rs.close();
                }
                if(sm!=null){

                    sm.close();
                }
                if(ct!=null){

                    ct.close();
                }
            }
            catch (Exception ex) {

                ex.printStackTrace();
            }


        }
    }

    //处理post请求
    //req: 用于获得客户端(浏览器)的信息
    //res: 用于向客户端(浏览器)返回信息
    public void doPost(HttpServletRequest req,HttpServletResponse res){

        this.doGet(req,res);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值