Servlet-请求转发与重定向

1.Servlet实例编写

(1)编写Servlet代码,一般继承HttpServlet类,重写doGet、doPost

(2)在web.xml中配置Servlet,可以配置url映射关系以及初始化参数

(3)在浏览器中访问或者表单提交

(4)通过Http请求类型自动调用对应的doGet或者doPost等方法

/**
 * 创建日期:2021/12/20
 * 作者:高靖博
 * 公司:华为(昆明)数字经济学院
 */
public class ServletDemo1 extends HttpServlet {


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

        String method = req.getMethod();
        // GET
        System.out.println(method);
    }

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

        System.out.println("登录操作");
        //初始化配置参数中取出参数值
        ServletConfig servletConfig = this.getServletConfig();
        //从配置文件中取出用户名和密码
        String s_userName = servletConfig.getInitParameter("userName");
        String s_pwd = servletConfig.getInitParameter("pwd");

        //从请求参数中取得用户填写的用户名和密码
        String userName = req.getParameter("userName");

        String pwd = req.getParameter("pwd");

        System.out.println("userName:"+userName);
        System.out.println("pwd:"+pwd);
        //响应页面的html
        String html = "";
        if(!(userName.equals(s_userName)&&s_pwd.equals(pwd))){

            html += "<html lang=\"en\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "    <title>登录</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "<span style='color:red'>用户名或密码错误!</span>"+
                    "  <form action=\"login\" method=\"post\">\n" +
                    "      <label>用户名</label>\n" +
                    "      <input type=\"text\" name=\"userName\" /><br/>\n" +
                    "      <label>密码</label>\n" +
                    "      <input type=\"password\" name=\"pwd\" />\n" +
                    "      <input type=\"submit\" value=\"登录\" />\n" +
                    "  </form>\n" +
                    "</body>\n" +
                    "</html>";

        }else{
            html += "<html>";
            html += "<head><title>结果</title></head>";
            html += "<body><h1>登录成功!</h1></body>";
            html += "</html>";
        }

        //返回响应  登录成功
        PrintWriter writer = resp.getWriter();

        writer.println(html);

        writer.flush();
        writer.close();

    }
}

2.Servlet的缺点

(1)Servlet需要返回HTML代码,将前端和后端代码耦合

3.请求重定向和请求转发

1.请求转发 RequestDispatcher接口

RequestDispatcher对象由Servlet容器创建,用于封装一个由路径所标识的服务器资源。利用RequestDispatcher对象,可以把请求转发给其它的Servlet或JSP页面,这个接口中定义了两个方法:

(1)forward(ServletRequest request, ServletResponse response)

该方法用于将请求从一个Servlet传递给服务器上的其它Servlet、JSP或者是HTML页面。在Servlet中,可以对请求进行初步处理,然后调用这个方法,由其它的资源来生成响应。

(2) include(ServletRequest request, ServletResponse response)

该方法用于在响应中包含其它资源的内容。与forward()不同的是,利用include()方法转发的资源将产生的响应并入到原来的响应对象中,原先的Servlet还可以继续输出响应信息。

2.请求转发

三种方法

 利用ServletRequest接口中的getRequestDispatcher()方法。
 利用ServletContext接口中的getNamedDispatcher()方法。 
 利用ServletContext接口中的getRequestDispatcher()方法。

请求转发特点

++ 服务器端行为,服务器进行servlet的转发

++ 携带请求、响应对象交给另一个Servlet处理

++ 浏览器的地址栏不会发生变化

++ forward方法是将请求响应交给另一个Servlet处理,自己本身的内容清空

++ include方法是将另一个Servlet的请求响应包含到当前Servlet中进行响应

forward方法:

req.getRequestDispatcher("Servlet的URL地址").forward(ServletRequest对象,ServletResponse对象)

include方法

req.getRequestDispatcher("Servlet的URL地址").include(ServletRequest对象,ServletResponse对象)

请求转发中参数的传递

如:Servlet1中设置参数,然后转发给Servlet2

 req.setAttribute("kkk","123456");

Servlet2取得参数

 Object kkk = req.getAttribute("kkk");

3.请求重定向

重定向的特点:

++ 重定向是客户端行为

++ 重定向不能共享请求资源

++ 重定向客户端地址栏会发生变化

写法:

//重定向是响应对象调用
        resp.sendRedirect("http://www.baidu.com");

4.服务端会话 Session

作用

++ 保存登录验证信息(验证令牌,验证码)

++ 服务端缓存

(1)设置的方法,通过请求对象获取

//获取Session
        HttpSession session = req.getSession();

        session.setAttribute("userIsLogin",true);//设置保存参数
        session.setMaxInactiveInterval(10);//设置过期时间(单位秒)

(2) 获取session中的参数

HttpSession session = req.getSession();
Object obj = session.getAttribute("userIsLogin");

(3)获取sessionid

String id = session.getId();//获取SESSION对象的唯一标识

5.实际开发中的Servlet

(1)请求的查询数据,Servlet返回结果使用JSON

(2)请求是增、删、改,返回操作的提示,也是一个JSON

(3)请求页面跳转(请求的重定向)

1.项目中的资源文件夹设置

后端业务模块分类:

​ 系统业务

​ ++ controller包: Servlet代码

​ ++ dao包: JDBC代码

​ ++ dto包 : 数据交换实体类

​ ++ util : 工具包(可以调用静态方法的类)

​ 核心业务

。。。

前端模块划分

++ views: 前端页面部分

​ ++ 业务块 ... : 针对各个业务的前端文件夹

​ ++ static : 前端使用的静态资源文件

++ lib:前端依赖(js)

2.编写项目过程

Servlet->service->dao -> 前端

demo:

响应数据实体封装

/**
 * 创建日期:2021/12/22
 * 作者:高靖博
 * 公司:华为(昆明)数字经济学院
 */
public class Result implements Serializable {

    private String code;//成功代码

    private String msg;//返回的消息(操作成功!  系统异常!  权限不足)

    private Object data = new Object();//封装返回数据的对象

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

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

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

跳转到登录页面

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

        //跳转到登录页面
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        String scheme = req.getScheme();
        String serverName = req.getServerName();
        int serverPort = req.getServerPort();
        String contextPath = req.getContextPath();

        String pathHead = scheme+"://"+serverName+":"+serverPort+contextPath;

        System.out.println(pathHead);

        this.getServletContext().setAttribute("pathHead",pathHead);

        resp.sendRedirect(pathHead+"/views/sys/loginIndex.html");

    }

登录Servlet

 /**
     * 相关的数据接口
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        String userName = req.getParameter("userName");
        String pwd = req.getParameter("pwd");

        //忽略逻辑判断。。。调用Service类

        Result res = new Result();

        res.setCode("0000");
        res.setMsg("登录成功!");

        String s = res.toString();

        resp.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.print(s);
        writer.flush();
        writer.close();


    }

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<!-- ajax jsp -->
<form action="http://localhost:8080/JavaServletDemo/login" method="post">
    <label>用户名</label>
    <input type="text" name="userName" /><br/>
    <label>密码</label>
    <input type="password" name="pwd" />
    <input type="submit" value="登录" />
</form>
</body>
</html>
上一篇:Node.js express 中间件


下一篇:bootstrap的bootbox 弹窗