web开发日记-servlet

servlet

Servlet(Server Applet),全称Java Servlet,暂无中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

servlet入门小实例

src下创建com.webtest.servlet.HelloServlet.java

package com.webtest.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by elijahliu on 2017/2/19.
 */
public class HelloServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("==========init with parameter=============");
        super.init(config);
    }

    @Override
    public void init() throws ServletException {
        System.out.println("================init without parameter");
        super.init();
    }

    @Override
    public void destroy() {

        System.out.println("========destroy============");
        super.destroy();
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("=============service===============");
        PrintWriter pw = resp.getWriter();//这三行用于将字符输出到浏览器,PrintWriter是一个字符输出流
        pw.println("Hellowworld");
        pw.close();//关闭输出流对象
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

    }
}

这里继承了 httpservlet ,使用PrintWriter输出流输出到页面。

相应的修改web.xml配置入口url


        HelloServlet
        com.webtest.servlet.HelloServlet
    
    
        HelloServlet
        /Hello
    

servelt-class用于连接完全限定名,也就是name对应的类的路径
servlet mapping 通过name与servlet相连接,然后通过下面的url-pattern,当浏览器路径是这个的时候,访问这个路径,就会调用对应的servlet来处理

servlet处理流程分析

web开发日记-servlet_第1张图片
servlet处理流程

处理流程:客户端发送request请求,到Tomcat webserver服务器,然后http服务器再再servlet容器中创建运行servlet,也就是说,在没有访问的请求发起时,servlet是不创建对象的。servlet的通过requset response对象来处理数据,结束后,可以再调用其他servlet,或最后直接将数据传输到浏览器返回响应。

servlet执行流程

web开发日记-servlet_第2张图片
servlet执行流程

在创建servlet实例时,会调用init()方法来进行初始化,初始化后,servlet才会处于服务状态。整个servlet生命周期中,只能进行一次初始化。
service()方法可以多次调用,这个请求次数有关,用来处理客户端的请求。
destroy()方法,在servlet不再使用时,容器会调用destroy()方法进行销毁servlet实例。、

servlet编程实例(1)

web开发日记-servlet_第3张图片
实例流程

首先创建Login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    loginservlet


其中的<%=request.getContextPath()%>
request.getContextPath() 返回站点的根目录
request.getRealpath("/")得到的是实际的物理路径,也就是你的项目所在服务器中的路径
request.getScheme() 等到的是协议名称,默认是http
request.getServerName() 得到的是在服务器的配置文件中配置的服务器名称 比如:localhost .baidu.com 等等
request.getServerPort() 得到的是服务器的配置文件中配置的端口号 比如 8080等等

再创建LoginServlet

package com.webtest.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by elijahliu on 2017/2/19.
 */
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);

        String username = req.getParameter("uname");
        String password = req.getParameter("upwd");

        System.out.println(username);
        System.out.println(password);


    }

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

    }
}

最后在web.xml中更改servlet的路径配置

 
    
        LoginServlet
        com.webtest.servlet.LoginServlet
    
    
    LoginServlet
        /LoginServlet
    

Servlet编程实例(2)

使用doGet doPost方法来实现登录逻辑.

web开发日记-servlet_第4张图片
get和post

将service的业务逻辑放到doPost中,在doGet中调用doPost。降低代码的重复性,更符合逻辑。

package com.webtest.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by elijahliu on 2017/2/19.
 */
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);

        


    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("uname");
        String password = request.getParameter("upwd");

        System.out.println(username);
        System.out.println(password);
    }

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

servlet编程实例(3) 添加登录后的处理流程

web开发日记-servlet_第5张图片
流程

建立success.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    success


success
用户<%=request.getParameter("uname")%>
密码<%=request.getParameter("upwd")%>
back to login

建立error.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    error


error happened
用户<%=request.getParameter("uname")%>
密码<%=request.getParameter("upwd")%>
back to login

更改LoginServlet文件,修改业务逻辑,重定向

package com.webtest.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by elijahliu on 2017/2/19.
 */
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("uname");
        String password = request.getParameter("upwd");

        System.out.println(username);
        System.out.println(password);

        if (username.equals("elijah") && password.equals("123456")) {//若用户密码相同,则重定向到相应的页面
            response.sendRedirect(request.getContextPath() + "/Servletpage/success.jsp");
        } else {
            response.sendRedirect(request.getContextPath() + "/Servletpage/error.jsp");
        }
    }

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

Servlet编程实例(4)

这里是用了请求转发,只进行一个请求响应流程。请求对象,传入servlet后,servlet将reques response对象转发到相应的成功失败页面。

package com.webtest.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by elijahliu on 2017/2/19.
 */
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("uname");
        String password = request.getParameter("upwd");

        System.out.println(username);
        System.out.println(password);

        String forward = null;
        if (username.equals("elijah") && password.equals("123456")) {//若用户密码相同,则重定向到相应的页面
            forward = "/Servletpage/success.jsp";
            RequestDispatcher rd = request.getRequestDispatcher(forward);//requestDispatcher是一个请求转发对象
            //getRequestDispatcher获取一个Dispatcher对象,forward为转发的地址
            rd.forward(request, response);//执行请求转发,转发当前的额request 和response对象

            //请求重定向
            //response.sendRedirect(request.getContextPath() + "/Servletpage/success.jsp");
        } else {

            forward = "/Servletpage/error.jsp";
            RequestDispatcher rd = request.getRequestDispatcher(forward);//requestDispatcher是一个请求转发对象
            //getRequestDispatcher获取一个Dispatcher对象,forward为转发的地址
            rd.forward(request, response);//执行请求转发,转发当前的额request 和response对象
            //请求重定向

            //response.sendRedirect(request.getContextPath() + "/Servletpage/error.jsp");
        }
    }

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

requestDispatcher是一个请求转发对象
getRequestDispatcher获取一个Dispatcher对象,forward为转发的地址

PS:需要注意一点的是,RequestDispatcher方法不能转发到不同的应用地址,如 转发地址为 www.google.com这是不可以的。但是response.sendRedirect重定向方法是可以的。

Servlet编程实例(5)

添加了 JBDC 数据库校验,完成校验用户的Service层的编写

在DAO层添加实现获取用户的方法,返回结果集
UserDao.java

package com.webtest.dao;

import com.webtest.entity.User;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Created by elijahliu on 2017/2/18.
 */
public interface UserDao {
    public void save(Connection conn, User user) throws SQLException;
    public void update(Connection conn,Long id,User user) throws SQLException;

    public void delete(Connection conn, User user) throws SQLException;

    //需要编写相应的实现,这是典型的面向接口的编程,接口只定义外观和行为

    //获取用户信息
    public ResultSet get(Connection conn, User user)throws SQLException;

}

在UserDaoimpl中实现get方法

  @Override
    public ResultSet get(Connection conn, User user) throws SQLException {
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM tbl_user WHERE name=? AND password=?");
        ps.setString(1, user.getName());
        ps.setString(2,user.getPassword());

        return ps.executeQuery();

    }

创建service层的包,com.webtest.service.

package com.webtest.service;

import com.webtest.dao.UserDao;
import com.webtest.dao.impl.UserDaoimpl;
import com.webtest.entity.User;
import com.webtest.util.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Created by elijahliu on 2017/2/19.
 */
public class CheckuserService {
    private UserDao userDao= new UserDaoimpl();//上转型建立一个持久层类
    public boolean check(User user){
        Connection conn = null;

        conn = ConnectionFactory.getInstance().makeConnection();//获取一个连接工厂类的单例连接
        try {
            conn.setAutoCommit(false);//设置不自动提交

            ResultSet rs = userDao.get(conn, user);//获取查询结果集
            while (rs.next()) {//不为空,则存在,那么就返回true
                return true;
            }
        } catch (SQLException e) {
            try {
                conn.rollback();//错误发生则回滚
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}

Servlet编程实例(6)

完成控制层的业务逻辑编写。在com.webtest.servlet下创建CheckServlet.java
在这个servlet中调用service层的CheckServlet中的check()方法,完成用户的校验,与成功或失败页面的跳转。在web.xml中,完成servlet的路径配置。CheckServlet相当于控制层。
CheckServlet.java

package com.webtest.servlet;

import com.webtest.entity.User;
import com.webtest.service.CheckuserService;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by elijahliu on 2017/2/19.
 */
@WebServlet(name = "CheckServlet")
public class CheckServlet extends HttpServlet {

    CheckuserService cku = new CheckuserService();//创建service 业务逻辑对象
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uname = request.getParameter("uname");
        String passwd = request.getParameter("upwd");

        RequestDispatcher rd = null;
        String forward = null;

        if (uname == null && passwd == null) {//如果用户名或密码为空,则转发到错误页面
            request.setAttribute("msg", "用户名或密码为空");
            rd = request.getRequestDispatcher("/Servletpage/error.jsp");
            rd.forward(request,response);
        } else {
            User user = new User();//创建用户对象,使用service层的check方法 判断是否存在该用户
            user.setName(uname);
            user.setPassword(passwd);
            boolean bool = cku.check(user);//检查用户是否在数据库中存在
            if (bool) {
                forward = "/Servletpage/success.jsp";

            }else{
                request.setAttribute("msg","用户名或密码错误,重新输入");
                forward = "/Servletpage/error.jsp";
            }
            rd = request.getRequestDispatcher(forward);//根据查出是否存在该用户,从而来确定执行转发的路径
            rd.forward(request,response);
        }
    }

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

web.xml



    
        CheckServlet
        com.webtest.servlet.CheckServlet
    
    
        CheckServlet
        /CheckServlet
    

Servlet编程实例(7)

完成了前端页面的编写,运行了登录实例程序。登陆页面在finalservlet包中。
对页面做一个最基础的页面美化。

创建finalservlet目录 存放三个前端页面

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: elijahliu
  Date: 2017/2/19
  Time: 20:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    login
    
    



用户登录
用户名:
密码:
<%--添加了一个onclik方法,触发时会调用check函数--%>

error.jsp

<%--
  Created by IntelliJ IDEA.
  User: elijahliu
  Date: 2017/2/19
  Time: 16:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    error
    


error happened <% Object obj = request.getAttribute("msg"); if (obj != null) { out.println(obj.toString()); } else { out.println("none"); } %> 用户<%=request.getParameter("uname")%>
密码<%=request.getParameter("upwd")%>
back to login

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: elijahliu
  Date: 2017/2/19
  Time: 16:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    success
    


success 用户<%=request.getParameter("uname")%>
密码<%=request.getParameter("upwd")%>
back to login

你可能感兴趣的:(web开发日记-servlet)