Servlet(三)

@WebServlet注解

学习使用Servlet3.0规范引入一个新的概念:Servlet注解,可以代替web.xml
* 1. 格式:   @WebServlet(....)
* 2. 位置:   放在想要访问的组件的类上面。  该类必须继承HttpServlet
*
*  注意事项:
*      - urlPatterns和value,只需要配置一个就可。  是数组形式,使用逗号隔开, 元素是字符串类型,每个元素都是以斜杠开头。
*        如果只有一个元素,{}可以省略
*      - urlPatterns依然支持精确匹配,通配符匹配,后缀匹配
*      - 每个属性都是使用逗号隔开
@WebServlet(
        name="m1",
        urlPatterns ={"/login.lr","/regist.lr","/getCode.lr"},
        initParams = {
                @WebInitParam(name="company",value = "佑才教育"),
                @WebInitParam(name="school",value="南开大学")},
        loadOnStartup = 1)
public class WebServletDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("--------Servlet注解的应用--------");
        ServletConfig config = getServletConfig();
        String company = config.getInitParameter("company");

        String school = config.getInitParameter("school");
        System.out.println(company+" "+school);
    }

还有以下写法:

@WebServlet(urlPatterns = {"*.do"})
//@WebServlet(urlPatterns = "*.do")
//@WebServlet("*.do")
public class WebServletDemo02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("-----Servlet最简单的配置,只需要配置urlPatterns-----------");
    }
}

 

获取Session对象

* HttpSession getSession(boolean f) * -- true: 服务器端一定会获取一个Session对象。 * 通过浏览器传过来的sid去查找session池里的session对象,如果找到了就返回。 * 没找到,或者根据就没有传过来sid。就新建。 * -- false: 如果没找到,或者压根没有传过来sid, 就返回null. 如果根据sid找到了,则返回找到的那个。 * * HttpSession getSession() * -- 相当于 第一个方法传入了true. 所以该方法一定会返回一个session对象 * * * Session对象,一旦创建后,会将SessionID以Cookie模式发送给浏览器端。 * -- SessionId是对象的唯一标识符。在浏览器端以: JSessionId = 具体值的方法存储在浏览器端。

public class SessionDemoServlet implements Servlet {
    Logger logger = Logger.getLogger(SessionDemoServlet.class.getName());
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
     端。
         */
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        //HttpSession session = request.getSession(true);
        HttpSession session = request.getSession();
        //绑定数据到session对象,调用setAttribute(String name,Object obj)
        session.setAttribute("username","zhangsan");
        session.setAttribute("user",new User("lisi","888888"));
    }

    @Override
    public String getServletInfo() {
        return "";
    }

    @Override
    public void destroy() {

    }
}

Filter接口

Filter接口,是Servlet规范中的三大接口之一,(Servlet接口,Listener接口,Filter接口) * 1. 是一个可插拔的Web组件 * 2. 可以在浏览器发送请求到Servlet组件之前,以及响应到浏览器之前进行筛选和过滤。 * 3. 过滤和筛选的逻辑在doFilter方法中编写

public class CommentFilter implements Filter {
    private FilterConfig config;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        config = filterConfig;
    }

    /**
     *
     * @param request   请求对象
     * @param response  响应对象
     * @param filterChain      过滤器链:  可以有多个过滤器,想要执行到Servlet组件,必须调用过滤器链的doFilter方法
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        String illegal1 = config.getInitParameter("illegal1");
        String illegal2 = config.getInitParameter("illegal2");

        String comment = request.getParameter("comment");
        if (comment.contains(illegal1)||comment.contains(illegal2)) {
            //使用响应对象告诉浏览器
            PrintWriter pw = response.getWriter();
            pw.write("您输入的内容非法,请重新输入");
        }else{
            //如果想要向下执行到servlet组件,需要调用过滤器链的doFilter方法,同时将请求对象和响应对象传过去
            filterChain.doFilter(request,response);
            System.out.println("---执行完service方法,才执行到此处----");


        }
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }


}

验证码

生成验证码图片时,可以将字符串绑定到session对象上,因为浏览器不关闭,session就是同一个
登录或者注册使用的都是同一个session对象
number变量为什么不能提成成员变量,因为验证码组件可以单独写一个。 还需要考虑每次访问组件时,是同一个对象吗?
 

public class LoginOrRegistServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();
        if (uri.contains("/login.lr")) {

        }else if (uri.contains("/register.lr")) {


            String checkCode = req.getParameter("checkCode");
            HttpSession session = req.getSession();
            String code = (String)session.getAttribute("code");
            if (!code.equalsIgnoreCase(checkCode)) {

            }


        }else if (uri.contains("getCheckCode.lr")){
            //创建一个图片面板对象
            BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
            //获取面板上的画笔对象
            Graphics g = image.getGraphics();
            //上色,绘制面板上的形状,绘制方形
            Random random = new Random();
            g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            g.fillRect(0, 0, 80, 30);
            //上色,设置字体大小,绘制字符串到面板上
            String number = getRandomNumber(4);
            g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            g.setFont(new Font("Times New Roman", Font.BOLD, 30));
            //绘制字符串时,是从左下角进行定位的
            g.drawString(number, 3, 24);
            /**
             * 生成验证码图片时,可以将字符串绑定到session对象上,因为浏览器不关闭,session就是同一个
             * 登录或者注册使用的都是同一个session对象
             *
             * number变量为什么不能提成成员变量,因为验证码组件可以单独写一个。 还需要考虑每次访问组件时,是同一个对象吗?
             */
            HttpSession session = req.getSession();
            session.setAttribute("code",number);

            //绘制线条,简单干扰一下注册/登录机器人。
            for (int i = 0; i < 4; i++) {
                g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
                g.drawLine(random.nextInt(80), random.nextInt(30), random.nextInt(80), random.nextInt(30));
            }
        }

    }

    /**
     * 获取一个随机的字符串,作为验证码图片上的字符
     * @param num
     * @return
     */
    public String getRandomNumber(int num){
        char[]  chars = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
        '0','1','2','3','4','5','6','7','8','9'};
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<num;i++){
            int index = (int)(Math.random()*chars.length);
            sb.append(chars[index]);
        }
        return sb.toString();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值