Servlet的使用

1.使用套接字实现web服务器功能

    /**
     * 利用套接字技术模仿一个web服务器
     */
    public static void main(String[] args)throws Exception {
        ServerSocket listener = new ServerSocket(8080);
        Socket accept = listener.accept();
        OutputStream os = accept.getOutputStream();
        FileInputStream fis = new FileInputStream("src\\Demo.html");
        byte[] b = new byte[1024*4];
        int len = 0;
        while((len=fis.read(b))!=-1){
            os.write(b);
            os.flush();
        }
        os.close();
        fis.close();
        accept.close();
        listener.close();
    }

2.常见的几种网络状态

3.自定义Servlet

public class MyServlet implements Servlet {
    //继承Servlet接口,重写其方法
    @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 {
        System.out.println("服务正常启动");
        int a = 10/0;
        servletResponse.getWriter().write("成功访问");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

web-xml的相关配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!--配置可以创建多个Servlet容器-->
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.qf.servlet.MyServlet</servlet-class>

        <!--servlet参数-->
        <init-param>
            <param-name>username</param-name>
            <param-value>zhuxi</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>20</param-value>
        </init-param>

        <!--serlet加载时机:(1)第一次访问Servlet时创建 (默认) (2)启动Tomcat时创建-->
        <!--默认值-1 表示第一次访问时创建-->
        <!-->=0 启动Tomcat时创建  数字越小优先级越高-->
        <load-on-startup>1</load-on-startup>

    </servlet>
    <servlet>
        //配置一些初始的参数
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.qf.servlet.MyServlet2</servlet-class>
        <init-param>
            <param-name>address</param-name>
            <param-value>北京</param-value>
        </init-param>


        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>MyServlet3</servlet-name>
        <servlet-class>com.qf.servlet.MyServlet3</servlet-class>
    </servlet>



    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <!--访问地址配置-->
        <!--1 精确匹配  /xxx-->
        <!--2 后缀匹配 *.do *.action  *表示所有字符-->
        <!--3 /* 匹配所得的请求 -->
        <!--4 / 匹配所得的请求 ,不包括jsp-->
        <!--其他写法
            /aaa/bbb/*  匹配 /aaa/bbb开头的地址
            /aaa/*/bbb  匹配/aaa/*/bbb 精确匹配
        -->
        <url-pattern>/myservlet</url-pattern>
        <url-pattern>/aaa/*/bbb</url-pattern>
        <!--常见错误
            1 地址不能重复
            2 精确匹配和后缀匹配不能一起使用,不能以/开头 ,*.xxx结尾
            3 不写/也不使用后缀匹配。Invalid <url-pattern> [myservlet2] in servlet mapping
        -->
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/myservlet2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MyServlet3</servlet-name>
        <url-pattern>/myservlet3</url-pattern>
    </servlet-mapping>

    
</web-app>

4.Servlet还可以通过继承 HttpServlet来创建

    //只需要重写doPost  doGet 两种方法就可以实现
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行了"+"doPost");
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行了"+"doget");
        ServletConfig sc = getServletConfig();
        String httpname = sc.getInitParameter("httpname");
        System.out.println(httpname);
    }

5.Servlet的生命周期(运行原理)以及注意事项

1.在第一次运行的时候进行实例化,然后进行初始化(这里两个步骤在整个Servlet阶段只执行一次);然后进入服务阶段,直到容器停止或者重新启动时,进行销毁。

2.由于Servlet有可能被多个客户同时访问,如果有的线程会对方法内部的成员变量修改,就有可能会造成线程安全问题。可以通过使用局部变量和加锁来避免减少这种状况

6.关于requset和response的基本应用

        //解决请求中的乱码问题
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        System.out.println(username);
        String password = request.getParameter("password");
        System.out.println(password);

        String accept = request.getHeader("Accept");
        System.out.println(accept);

        String method = request.getMethod();
        System.out.println(method);

        String requestURI = request.getRequestURI();
        System.out.println(requestURI);

        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);

        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);

/*        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }*/
        //服务器的响应
        //解决相应中的乱码问题
        //response.setContentType("text/html;charset=utf-8");
        response.setHeader("Content-Type","text/html;charset=utf-8");
        response.getWriter().write("<h1>我是哈哈</h1>");

7.转发与重定向

转发是由服务器的行为,转发不会丢失数据;

重定向是客户端的行为,会发生数据丢失。

@WebServlet(name="RegisterServlet",value = "/regist",loadOnStartup = 0)
public class RegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost执行");
        //转发与重定向
        //首先解决编码的乱码问题
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        if(username.equals("admin") && pwd.equals("888")){
            //RequestDispatcher requestDispatcher = request.getRequestDispatcher("Welcome.html");
            //requestDispatcher.forward(request,response);
            //简写
            request.getRequestDispatcher("Welcome.html").forward(request,response);
        }else{
            //重定向
            response.sendRedirect("Register.html");
        }



    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

8.Cookie的应用

创建与配置Cookie

public class cookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie
        Cookie cookie = new Cookie("username","yangxiaopeng");
        Cookie cookie2 = new Cookie("address","北京");
        //设置路径
        cookie.setPath("/");
        //设置存活时间
        cookie.setMaxAge(60*60*24);
        //设置setHttpOnly
        cookie.setHttpOnly(true);
        //服务器添加cookie
        response.addCookie(cookie);
        response.addCookie(cookie2);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

读取Cookie

        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+"==="+cookie.getValue());
            }
        }

Cookie的修改与删除

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookies = new Cookie("username", "lisa");
        cookies.setPath("/");
        //更新Cookie必须是的name属性和setPath与修改的Cookie保持一致
        //删除操作,另存活周期为0就是删除操作(-1浏览器关闭时删除)(0直接删除)(>0 表示设置的存活时间,单位为秒)
        //cookies.setMaxAge(0);
        response.addCookie(cookies);
        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

9.Session的应用

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //获取属性
        System.out.println("ID"+session.getId());
        //session.getMaxInactiveInterval()是获得session的最大存活时间,默认是1800秒!就是说你不动浏览器,在三十分钟后它会自动消毁!
        //这个有效期是指最后一次访问时间开始计算
        System.out.println("存活时间"+session.getMaxInactiveInterval());
        //修改属性
        //session.setMaxInactiveInterval(60*10);
        //不过推荐使用在web-xml文档中修改数据

        //获取创建时间
        System.out.println("创建时间"+new Date(session.getCreationTime()).toLocaleString());
        //获取最后一次访问时间(上一次的访问时间)
        System.out.println("最后一次的访问时间"+new Date(session.getLastAccessedTime()).toInstant());

        //手动设置session失效
        //session.invalidate();
/*        //设置数据
        session.setAttribute("username","张三");
        //得到数据
        String  username =(String) session.getAttribute("username");
        //移除数据
        session.removeAttribute("username");*/
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

10.验证码的应用

@WebServlet(name = "ImageCodeServlet",value = "/imagecode")
public class ImageCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //ValidateCode(100, 30, 4, 20)100表示图形验证框的宽度,30表示高度,4表示需要验证的位数
        //20表示模糊程度
        ValidateCode validateCode = new ValidateCode(100, 30, 4, 20);
        HttpSession session = request.getSession();
        session.setAttribute("code",validateCode.getCode());
        //以图形的方式输出
        validateCode.write(response.getOutputStream());

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

11.防止Cookie禁用

public class ReWriteURLServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        HttpSession session = request.getSession();
        
        //encodeRedirectURL当用户设置禁止Cookie的时候在用户第一次访问的时候追加一个session
        //之后每次刷新就不在此重写url,除非关闭或使用不同的浏览器访问(每次生成的都是不同的session)
        String url = response.encodeRedirectURL("index");
        writer.write("<a href='"+url+"'>查询界面</a>");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

12.ServletContext

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext appliction = getServletContext();
        String path = appliction.getRealPath("/img/index.jpg");
        FileInputStream fis = new FileInputStream(path);
        byte[] b = new byte[1024];
        int len = 0;
        ServletOutputStream os = response.getOutputStream();
        //ServletContext服务器的全局容器
        //通过这个容器可以实现文件加载的功能
        response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode("哈哈.jpg","utf-8"));
        while((len=fis.read(b))!=-1){
            os.write(b,0,len);
        }
        //关闭
        fis.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值