Java学习笔记之:Servlet写法

一、编写servlet

1.编写servlet我么需要继承HttpServlet(一个java类,提供了servlet的接口方法)

public class HelloServlet extends HttpServlet

2.HttpServlet提供了:init():初始化服務器, doget()&&dopost():处理请求的方法,destroy():销毁的方法。

public class HelloServlet extends HttpServlet {
    /**
     *

       * 1.servlet 的初始化方式init()方法的执行
       * a.在用户第一次发起请求的时候执行init()方法。方法只会执行一次
       * b.在web.xml文件中配置<load-on-startup>1</load-on-startup>,init()方法会在服务器
       * 启动的时候执行。load-on-startup 的值为0-9的任意值,值的大小不具备任何含义,只有值本身有一定
       * 的语义.表示如果配置了值就是在服务器启动的时候执行init()方法.init()方法同样的只会执行一次.
       * c.在服务器启动的时候执行init()方法,并且进行参数的传递,那么执行的是init()的方法重载.

*/
    @Override
    public void init() throws ServletException {
        System.out.println("init");
    
    }

    /**
     * get方式请求
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("do get");
        // 返回页面的方法
        req.getRequestDispatcher("main.jsp").forward(req, resp);

    }

    /**
     * post方式请求
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("do post");
        // 返回页面的方法
        req.getRequestDispatcher("main.jsp").forward(req, resp);
    }

    /**
     * 销毁服务
     */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

3.配置web.xml文件:是连接页面和服务器端之间的桥梁

 <!-- 
  servlet的配置文件的配置要求
  1.servlet和servlet-mapping节点的子节点servlet-name要是对应的。
  2.servlet-class指向的是目标servlet的java类的全路径
  3.url-patern负责过滤页面传来的请求是否通过,匹配页面的请求url
   -->
  <servlet>
  <servlet-name>hello</servlet-name>
  <servlet-class>com.hgd.servlet.HelloServlet</servlet-class>
  </servlet>
    <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/hello</url-pattern>
  </servlet-mapping>
    <servlet>  

4.编写页面的请求:见index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
</head>

<body>
    <p>servlet页面的写法</p>
    <!-- herf的值就是请求的url,默认的就是get方式-->
    <a href="hello?user=admin&pwd=123">这是一个超链接</a>
    <hr>
    <!-- get方式post方式的区别 :
    1.get方式会将参数加到请求url后面进行参数传递,post方式是通过post机制来进行参数传递。
    2.get方式是用来获取数据,post是发送数据
    3.get传输速度比较快,二数据传输大小最大是4k,post传输速度比较慢,可以传输的数据大小理论上没有限制,会因为操作系统的不同有所限制
    4.get的安全性比比较低,post安全性比较高
    -->
    <!-- 请求的方法是get,action的值要和web.xml文件中url-pattern节点的text值相同 -->
    <form action="hello" method="get">
        <button type="submit">doget</button>
    </form>
    <hr>
    <!-- 请求的方法是post,action的值要和web.xml文件中url-pattern节点的text值相同 -->
    <form action="hello" method="post">
        <button type="submit">dopost</button>
    </form>
</body>
</html>

 5.编写返回页面

<body>
    This is my JSP page.
    <br>
    <%--
    <% 代码 %>  可以编写java代码
    <%=输出的内容 %>    =后面的内容表示输出到页面
    --%>
    <%
        //request:是内置对象,不需要声明的可以直接使用
        Object obj = request.getAttribute("msg");

        if (obj != null) {
    %>
    <p style="color: red;">
        <%=obj.toString()%>
    </p>
    <%
        }
    %>
</body>

6.在doget或dopost方法中编写指定返回页面

// 返回页面的方法
 req.getRequestDispatcher("main.jsp").forward(req, resp);

二、servlet的声明周期

当用户从视图层发起一个request请求,那么这个请求将通过web.xml文件,来进行比对 ,如果请求的url
能被通过。那么将通过web.xml文件中的<servlet-name>这个节点找到对应的servlet如果请求方式是
 get那么将执行doget方法,请求方式是 post那么将执行dopost方法,在用户第一次请求的时候执行init
 方法,在服务器关闭的时候 执行destroy方法,如果在web.xml文件中配置了
<load-on-startup>0</load-on-startup>,那么init方法将在服务器启动的时候执行,当init()
 方法和init(ServletConfig config)同时被重写的 时候,将会调用init(ServletConfig config)
方法。这个方法可以在服务器初始化的时候进行参数的传入。

三、servlet执行流程

 1.用户从页面发起一个请求
 2.请求通过web.xml文件找到对应的url-pattern,根据servlet-name的text值找到对应的servlet
 -class,通过反射来创建servlet对象,如果请求是get方式,那么将执行doget(),
 如果请求是post方式,那么将执行dopost()方法。
 3.在执行目标方法后通过req.getRequestDispatcher("main.jsp").forward(req, resp);返回给用户对应的页面

四、实例 

 

1.web.xml

    <servlet>  
  <servlet-name>user</servlet-name>
  <servlet-class>com.hgd.servlet.UserServlet</servlet-class>
  </servlet>
  
    <servlet-mapping>
  <servlet-name>user</servlet-name>
  <url-pattern>/user</url-pattern>
  </servlet-mapping>

2.login.jsp

<body>
    <form action="user" method="get">
        <input name="user"> <input name="pwd">
        <button type="submit">doget</button>
    </form>
    <%--
    <% 代码 %>  可以编写java代码
    <%=输出的内容 %>    =后面的内容表示输出到页面
    --%>
    <%
        //request:是内置对象,不需要声明的可以直接使用
        Object obj = request.getAttribute("msg");
        if (obj != null) {
    %>
    <%=obj.toString()%>
    <%
        }
    %>
    <hr>
    <form action="user" method="post">
        <input name="user">
        <button type="submit">dopost</button>
    </form>
</body>

3.main.jsp

<body>
    This is my JSP page.
    <br>
    <%--
    <% 代码 %>  可以编写java代码
    <%=输出的内容 %>    =后面的内容表示输出到页面
    --%>
    <%
        //request:是内置对象,不需要声明的可以直接使用
        Object obj = request.getAttribute("msg");

        if (obj != null) {
    %>
    <p style="color: red;">
        <%=obj.toString()%>
    </p>
    <%
        }
    %>
</body>

4.UserServlet.Java

/**
* 
 * 1.页面的请求可以有两中写法 form表单   a超链接
 * 2.超链的写法
 *         详细见index.jsp 
 * 3.get和post请求方式的区别:
 *         详细见index.jsp
 * 4.request传值:
 *         页面和服务器端之间的数据传输是通过HttpServletRequest这个对象来完成
 *     4.1:从页面向服务端传输数据
 *         页面传来的数据格式为 key=value
 *         可以在目标方法中通过getParameter(key),来获取到页面传递的数据,默认的
 *         都是String类型
 *         超链传递参数可以将参数直接加入到url上面hello?user=admin&pwd=123
 *     4.2:服务器端向页面传递参数
 *         通过HttpServletRequest对象进行传递
 *         通过request.setAttribute(key,value)方法,在页面可以通过
 *         request.getAttribute(key)方法来获取值,传递值的类型是Object,在
 *         获取到数据后需要进行数据类型转换
 *         详细包含index.jsp和main.jsp
 *
 *
 */
public class UserServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("init");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("doGet");
        // 获取页面传输过来的数据:默认的都是字符串
        String username=req.getParameter("user");
        String password=req.getParameter("pwd");
        System.out.println("doget:"+username+password);
        String result = "";// 登陆是否成功的返回提示
        if ("admin".equals(username) && "123".equals(password)) {
            result = "你的账号密码正确的,可以可以访问";
            req.setAttribute("msg", result);//服务器端向页面传递参数
            req.getRequestDispatcher("main.jsp").forward(req, resp);
            
        } else {
            result = "你的账号密码不对,你不可以访问";
            req.setAttribute("msg", result);//服务器端向页面传递参数
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("doPost");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

 

posted @ 2016-10-15 14:39  HuTiger  阅读(2411)  评论(0)    收藏  举报