ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Servlet-请求转发与重定向

2021-12-23 12:04:24  阅读:120  来源: 互联网

标签:String ++ resp req 转发 请求 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>

标签:String,++,resp,req,转发,请求,Servlet,重定向
来源: https://www.cnblogs.com/DQGonoes/p/15722812.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有