一.创建一个JavaWeb工程

a.新建一个Project项目

b.变成一个web工程

如果右键没有该选项,参考博文:解决无add framework support

c.如果想把其当web运行,需要与tomcat(web服务器)联系起来

二.第一个Servlet程序

a.要完成实现一个Servlet程序,需要先导包(javax在jdk中没有)

工程点击右键->open module settings->libraries->+->Java->找到tomcat中lib路径

地址路径:D:\program files\apache-tomcat-8.5.35\lib

接下来就可以开始写程序了

1.实现Servlet接口

//此时需要implements Servlet这个接口
public class MyFirstServlet implements Servlet {
    @Override
    //初始化方法调用时机;默认情况下,Servlet被第一次访问时调用
    //调用次数:1次
    public void init(ServletConfig servletConfig) throws ServletException {}

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

    //调用时机:每次servlet被访问时调用
    //调用次数:多次
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}

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

    @Override
    public void destroy() {}
}

此时我想把响应打在对应的网页上就在Service中写,就写以下逻辑

    //真正处理请求的方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //用户的请求会被封装到 ServletRequest对象中
        //响应结果会被封装到ServletResponse对象中
        //如果我想输出,直接用sout只会在控制台显示,想在用户端需要输出,需要用ServletResponse对象
        servletResponse.setContentType("text/html") ;//可以不写,代表我以网页的形式输出
        PrintWriter writer = servletResponse.getWriter();//返回的是IO流中的字符输出流
        writer.println("<html><head></head><body>hello Servlet</body></html>");
        writer.close();
    }

此时容器不知道我们写了这个东西,需要url让别人请求你这个资源,我才能进行相应

所以我们需要在web->web-inf->web.xml下写一个配置

<web-app .....>
    <servlet>
        <servlet-name>MyFirstServlet</servlet-name><!--取一个名字,随便取-->
        <servlet-class>ch02.demo.MyFirstServlet</servlet-class><!--对应着我项目中的这个类-->
    </servlet>
    <servlet-mapping><!--将这个servlet映射到这个url-->
        <servlet-name>MyFirstServlet</servlet-name><!--对应着上面取的名字-->
        <url-pattern>/myfirst</url-pattern>
    </servlet-mapping>
</web-app>

以上的xml配置也可以用在类上面的注解实现

@WebServlet(name = "MyFirstServlet",urlPatterns = "/myFirstServlet")
public class MyFirstServlet implements Servlet {}

2.继承HttpServlet类

因为Servlet接口不只是提供Web的接口,因此我们可以使用它的子HttpServlet来代替它

public class MySecondServlet extends HttpServlet {
    //一个是为了处理get请求,一个处理post请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//返回的是IO流中的字符输出流
        writer.println("<html><head></head><body>hello Servlet</body></html>");
        writer.close();
    }

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

配置文件

    <servlet>
        <servlet-name>MySecondServlet</servlet-name>
        <servlet-class>ch02.demo.MySecondServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MySecondServlet</servlet-name>
        <url-pattern>/mysecond</url-pattern>
    </servlet-mapping>

三.使用Servlet完成用户登录

a.创建一个用户登陆的html界面和登录成功的html

<html lang="en">
<head>
    <!--登录界面-->
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<div align="center">
    <h1>用户登录</h1>
    <form action="../login" method="post"><!--action与下面xml的url对应,要../是因为我的网页是写在ch02下,所以得跳上一级到web-->
        用户名:<input type="text" name="username"></br>
        密码:<input type="password" name="password"></br>
        <input type="submit" value="登录"></input>
    </form>

</div>

</body>
</html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录成功</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>

b.创建Servlet

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    //当表单点击登录,都会默认以doPost方式提交
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取用户输入的用户名
        String username = req.getParameter("username");//需要与表单的name属性一致
        String password = req.getParameter("password");

        if(username.equals("admin")&& password.equals("123")){
            resp.sendRedirect("cho2/success.html");//跳转到指定页面
        }else{
            resp.sendRedirect("cho2/login.html");
        }
    }
}

c.配置文件中进行映射

   <servlet>
            <servlet-name>LoginServlet</servlet-name>
            <servlet-class>ch02.demo.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
            <servlet-name>LoginServlet</servlet-name>
            <url-pattern>/login</url-pattern><!--需要与html中的action对应-->
    </servlet-mapping>

思考:

  • 如果用户直接打开success.html会怎么样?
  • 如何在用户名错误的情况下回到登录页面并显示错误信息?
  • 如何在登录成功的情况下在success.html中显示用户的信息?

四.会话跟踪

1.Cookie

用户信息保存到客户端,不安全

public class LoginServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    //当表单点击登录,都会默认以doPost方式提交
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if(username.equals("admin")&& password.equals("123")){
            //创建cookie对象,把用户名保存到cookie中加到响应里
            Cookie cookie = new Cookie("username","admin");
            resp.addCookie( cookie);//把cookie加到响应中

            //resp.sendRedirect("ch03/success.html");//跳转到指定页面
            resp.sendRedirect("success");
        }else{
            resp.sendRedirect("ch03/login.html");
        }
    }
}
public class SuccessServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //拿取cookie
        Cookie[] cookies = req.getCookies();
        boolean flag = false;
        for(Cookie cookie:cookies){
            if(cookie.getName().equals("username")&&cookie.getValue().equals("admin")){
                flag = true;
                break;
            }
        }
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if(flag){
            out.print("<html lang=\"en\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "    <title>登录成功</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "<h1>Success</h1>\n" +
                    "</body>\n" +
                    "</html>");
        }
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <!--登录界面-->
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<div align="center">
    <h1>用户登录</h1>
    <form action="../login1" method="post">
        用户名:<input type="text" name="username"></br>
        密码:<input type="password" name="password"></br>
        <input type="submit" value="登录"></input>
    </form>

</div>

</body>
</html>
    <servlet>
        <servlet-name>LoginServlet1</servlet-name>
        <servlet-class>ch03.LoginServlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet1</servlet-name>
        <url-pattern>/login1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SuccessServlet</servlet-name>
        <servlet-class>ch03.SuccessServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SuccessServlet</servlet-name>
        <url-pattern>/success</url-pattern>
    </servlet-mapping>

缺点:

  • 移动端App无法使用Cookie
  • 不安全,用户可以自己禁用Cookie
  • Cookie不能跨域

2.HttpSession

它是所有会话跟踪技术中最安全和最常用的技术

public class LoginServlet1 extends HttpServlet {


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if(username.equals("admin")&& password.equals("123")){
//            //创建cookie对象,把用户名保存到cookie中加到响应里
//            Cookie cookie = new Cookie("username","admin");
//            resp.addCookie( cookie);//把cookie加到响应中

            HttpSession session = req.getSession();//创建session对象
            session.setAttribute("username","admin");//保存用户名到session中
            
            resp.sendRedirect("success");
        }else{
            resp.sendRedirect("ch03/login.html");
        }
    }
}
public class SuccessServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        //拿取cookie
//        Cookie[] cookies = req.getCookies();
//        boolean flag = false;
//        for(Cookie cookie:cookies){
//            if(cookie.getName().equals("username")&&cookie.getValue().equals("admin")){
//                flag = true;
//                break;
//            }
//        }


        HttpSession session = req.getSession();//拿到同一个 session
        String username = (String)session.getAttribute("username");

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if(username!=null&&username.equals("admin")){
            out.print("<html lang=\"en\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "    <title>登录成功</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "<h1>Success</h1>\n" +
                    "</body>\n" +
                    "</html>");
        }


    }
}

缺点:

  • 服务器集群环境下无法直接使用Session
  • Cookie的缺点

五.Web开发模式MVC

示例:

jsp放在WEB-INF目录下,让用户不能直接访问

/*
   POJO: Plain Old Java Object
   仅用于封装数据
 */
public class User {
    private String name;
    private String password;

    public User() {
    }
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
/*
  Service:BusinessBean
  业务逻辑Bean,完成业务逻辑功能
 */
public class UserService {
    private String msg;

    public boolean login(User user){
        if(user.getName().length()>8){
            this.msg = "用户名长度不能超过8位";
            return false;
        }
        if(user.getPassword().length()>16){
            this.msg = "密码长度不能超过16位";
            return false;
        }
        .................
        return false;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐