servlet的重定向和转发;结合MVC;jsp运行原理


htmlHelper

userLoginServlet()

login.html

EmplistServlet()查询所有员工

 list.html:

要求:点击登录按钮直接跳转到所有用户页面

1.重定向:

监测浏览器数据 

 重·定向状态码302:成功,获取到的是一个地址

2. 通过转发的方式实现页面的跳转

通过loginServlet的doPost 的forward(,)跳转到 emplist 的doPost  dopost访问doget


htmlHelper

public class HtmlHelper {

    public static String getHtml(String fileName, HttpServlet servlet) {
        try {
            String relativePath = "/WEB-INF/temps/" + fileName;
            ServletContext context = servlet.getServletContext();
            String realPath = context.getRealPath(relativePath);
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(realPath), "utf-8"));
            StringBuffer sb = new StringBuffer("");
            String line = "";

            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }//将网页写出到浏览器
            String html = sb.toString();
            //
            return html;
        } catch (Exception e) {
            return null;
        }


    }
}
  • 解析:将WEB-INF下的temps受保护的html读取:传入一个fileName :和调用html的servlet
  • ServletContext context = servlet.getServletContext();得到的是/web  是tomcat服务器的运行根路径;给tomcat识别
  •   
    相对路径转绝对路径的一个方法getRealPath:
    String realPath = context.getRealPath(relativePath);
  • BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(realPath), "utf-8"));通过字符输入流读取磁盘文件(html)
  • StringBuffer sb = new StringBuffer("");
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }//将读取到的数据按行添加到一个sb线程安全字符串内
  • String html = sb.toString();
    return html;//将sb转换为字符串赋给html并返回

userLoginServlet()


//负责接收用户的登录请求(POST)
@WebServlet("/login")
public class UserLoginServlet extends HttpServlet {
    //不存在多线程安全问题
    private UserService service= new UserServiceImpl();
//    @Override
//    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
//        response.setHeader("Content-Type","text/html;charset=utf-8");
        //处理用户的第一次登录;默认是get方式提交

        //这个对象全局只有一份;在tomcat启动时创建;
        //上下文对象中提供了一个方法可以用于相对路径转绝对路径的一个方法getRealPath


            //把网页读取
//        StringBuffer sb=new StringBuffer("");
//        String line="";
//        while((line=reader.readLine())!=null){
//            sb.append(line);
//        }//将网页写出到浏览器
//        String html=sb.toString();
//        html=html.replace("{{errorInfo}}","");
//        response.getWriter().write(html);

   // }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Content-Type","text/html;charset=utf-8");
        String html = HtmlHelper.getHtml("login.html", this);
        html=html.replace("{{errorInfo}}","");
        resp.getWriter().write(html);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //1.获取请求的参数
        String username = request.getParameter("username");
        String password=  request.getParameter("password");
        //2.调用业务方法
        boolean flag = service.checkUserLogin(new User( username, password));
        //3.根据业务处理的结果进行响应
        response.setHeader("Content-Type","text/html;charset=utf-8");
        //以网页输出
        if(flag){

            //response.getWriter().write("登录成功!");
            String contextPath = this.getServletContext().getContextPath();
            //获取上下文
            System.out.println("contextpath"+contextPath);//获取根目录  /web
            //response.sendRedirect(contextPath+"/list");//重定向daoemp中//给浏览器看
            //调用请求转发器对象的forward方法实现页面的跳转
            request.getRequestDispatcher("/list").forward(request,response);
            //为true返回emp的地址
        }else{
            String html = HtmlHelper.getHtml("login.html",this);
            System.out.println(html);
          //打印登陆失败
            response.getWriter().write(html.replace("{{errorInfo}}","账号和密码错误"));
            //HtmlHelper.getHtml("login.html",this);

//            html=html.replace("{{errorInfo}}","账号或密码错误");
//            response.getWriter().write(html);
            //登录失败
            //给浏览器响应一个网页(String)
//            String html="<!DOCTYPE html>\n" +
//                    "<html lang=\"en\">\n" +
//                    "<head>\n" +
//                    "    <meta charset=\"UTF-8\">\n" +
//                    "    <title>系统登录</title>\n" +
//                    "</head>\n" +
//                    "<body>\n" +
//                    "   <form action=\"/web/login\" method=\"post\">\n" +
//                    "        <table>\n" +
//                    "            <tr>\n" +
//                    "                <td>账号:</td>\n" +
//                    "                <td><input name=\"username\"></td>\n" +
//                    "            </tr>\n" +
//                    "            <tr>\n" +
//                    "                <td>密码:</td>\n" +
//                    "                <td><input type=\"password\" name=\"password\"></td>\n" +
//                    "            </tr>\n" +
//                    "            <tr>\n" +
//                    "                <td><input type=\"submit\" value=\"登录\"></td>\n" +
//                    "                <td style=\"color:red\">用户名或密码错误!</td>\n" +
//                    "            </tr>\n" +
//                    "        </table>\n" +
//                    "   </form>\n" +
//                    "</body>\n" +
//                    "</html>";

            //使用IO流技术从磁盘上直接读取login.html中的文本内容

            //相对路径转绝对路径

          //String relativePath="/WEB-INF/login.html";//out目录下的(根目录)
            //每个servlet中都可以调用getServletContext()方法获取到一个servlet上下文对象
            //这个对象对于整个项目来说全局只有一份,在tomcat一启动的时候立马创建
            //上下文对象中提供了一个方法可以用于相对路径转绝对路径的一个方法getRealPath


            //ServletContext context = this.getServletContext();//获取到一个servlet上下文对象
            //这个对象全局只有一份;在tomcat启动时创建;
            //上下文对象中提供了一个方法可以用于相对路径转绝对路径的一个方法getRealPath
            //String realPath = context.getRealPath(relativePath);

            //System.out.println(realPath);


            //BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"utf-8"));
            //System.out.println(reader);

           //StringBuffer sb=new StringBuffer("");
           //String line="";
           //while((line=reader.readLine())!=null){
           //    sb.append(line);
          // }
          // String html1=sb.toString();
         // html=html1.replace("{{errorInfo}}","账号或密码错误!");
          //response.getWriter().write(html);


        }



    }
}
  • 解析:
    @WebServlet("/login"):设置servlet访问路径;
  • doGet():
  • 在地址栏输入url访问是Get提交方式方法
    String html = HtmlHelper.getHtml("login.html", this):获取到login.html的内容html=html.replace("{{errorInfo}}","");//将用来显示信息的标记值为空
    resp.getWriter().write(html);//将html返回;和原页面一样

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>系统登录</title>
</head>
<body>
   <form action="/web/login" method="post">
        <table>
            <tr>
                <td>账号:</td>
                <td><input name="username"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="登录"></td>
                <td style="color:red">{{errorInfo}}</td>
            </tr>
        </table>
   </form>
</body>
</html>
  • method=post
    • 当输入账号密码后登录时发送post请求;post请求会访问doPost()方法
 //1.获取请求的参数
        String username = request.getParameter("username");
        String password=  request.getParameter("password");
        //2.调用业务方法
        boolean flag = service.checkUserLogin(new User( username, password));
        //3.根据业务处理的结果进行响应
        response.setHeader("Content-Type","text/html;charset=utf-8");
        //以网页输出
        if(flag){

            //response.getWriter().write("登录成功!");
            String contextPath = this.getServletContext().getContextPath();
            //获取上下文
            System.out.println("contextpath"+contextPath);//获取根目录  /web
            //response.sendRedirect(contextPath+"/list");//重定向daoemp中//给浏览器看
            //调用请求转发器对象的forward方法实现页面的跳转
            request.getRequestDispatcher("/list").forward(request,response);
            //为true返回emp的地址
        }else{
            String html = HtmlHelper.getHtml("login.html",this);
            System.out.println(html);
          //打印登陆失败
            response.getWriter().write(html.replace("{{errorInfo}}","账号和密码错误"));
  • //调用请求转发器对象的forward方法实现页面的跳转
    request.getRequestDispatcher("/list").forward(request,response);
  • 检查登录失败:
    •   String html = HtmlHelper.getHtml("login.html",this);//获取html
        System.out.println(html);
      //打印登陆失败
        response.getWriter().write(html.replace("{{errorInfo}}","账号和密码错误"))//显示登录失败

EmplistServlet()查询所有员工

@WebServlet("/list")
public class EmpListServlet extends HttpServlet {
    private EmpService service = new EmpServiceImpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        //EmpService service = new EmpServiceImpl();
        List<Emp> empList =service.findEmpList();
        HtmlHelper html = new HtmlHelper();
        StringBuffer sb=new StringBuffer("");
        for(Emp employee:empList)
        {
            sb.append("<tr>"+"<td>"+employee.getId()+"</td>" +
                    "<td>"+employee.getName()+"</td>" +
                    "<td>"+employee.getGender()+"</td>" +
                    "<td>"+employee.getBirth()+"</td>" +
                    "<td>"+employee.getDeptid()+"</td>" +
                    "<td><button type=/'button/'>修改</button><form action='/web/delet' >\n" +
                     "<input type='hidden' name='id' value= "+employee.getId()+">"+
                    "<input type='submit'  value='删除'>\n"+
                    "</form></td>" +
                    "</tr>");
        }
        String trs=sb.toString();
        String list = HtmlHelper.getHtml("list.html",this);
        String htmls = list.replace("{{emplist}}",trs);
        resp.getWriter().write(htmls);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);//在post里访问get
    }
}

 list.html:

解析:将<td>标记</td> 标记用来填写emplistServlet查询到的所有员工信息;并且添加每个员工删除和修改按钮

要求:点击登录按钮直接跳转到所有用户页面

1.重定向:

.通过重定向技术实现页面的跳转

语法:调用response[响应]对象的sendRedirect("url")方法即可

重定向一定是走get请求,因为它是通过浏览器的地址栏发送过来的,我们都可以看到地址栏的URL的变化

服务器一旦给了浏览器响应则意味着本次请求处理响应的过程就结束了

重定向的页面跳转发生在客户端浏览器中

监测浏览器数据 

 

 重·定向状态码302:成功,获取到的是一个地址

 

2. 通过转发的方式实现页面的跳转

(从一个servlet中转到另一个servlet中)

所谓的转发我们可以认为是在服务端的某个servlet直接调用另一个servlet的请求处理方法,对于客户端来说是无感知的

因此跳转之后浏览器的地址栏的url没有发生变化的

服务端会将转发地址中的/解析为当前项目的根路径

  • request.getRequestDispatcher("/list").forward(request,response):在userloginServlet处理完成验证后调用方法跳转到/list servlet (empListServlet)
  • 通过loginServlet的doPost 的forward(,)跳转到 emplist 的doPost  dopost访问doget

重定向和转发器的比较

  • 获取当前登录对象

  • 重定向通过浏览器;   转发器通过服务器:效率更高

  • 重定向是两次请求 ;   转发器是一次请求

  • 重定向一旦响应接受后处理方法中的request对象和response对象就马上销毁;再访问list时无法获取到请求域信息了

  • String contextPath = this.getServletContext().getContextPath();
    response.sendRedirect(contextPath + "/list?username=" +  username);
  • 转发forward(request,response )  :

    基于request对象获取到一个请求的转发器(对象),也要指定一个转发的地址
    request.getRequestDispatcher("/WEB-INF/page/list.jsp").forward(request,response);
  • 转发的方式: 通过login的post方法传给list的post 用的req resp是同一个对象;在list的req能拿到login的req获取的用户名;转发时;在login销毁之前将req和resp对象内容给了 list

list数据更新

  • 用转发会出现表单重复提交 ;

  • 改成重定向;

  • 转发只能在当前项目内部跳转?

  • response.sendRedirect(contextPath+"/list?username"+username);//重定向daoemp中//给浏览器url更新
  • 转发的页面跳转只能在当前项目内部;在 /web 目录下寻找资源; 如果跳转到外部连接是不成功的;

  • list里有前端代码?前端代码耦合在javaservlet

  1. 把java代码和前端完全分开;

    1. 以jsp的方式  jsp javaserver page  jsp在项目中做web资源; asp微软;asp.NET PHP
    2. 作为一个web资源,可以通过浏览器直接访问 localhost:8080/web/xxx.jsp

    3. 用默认的servlet处理jsp servlet处理方式?

      1. tomcat 的web.xml 配置了对静态资源处理方式 

4.jspServlet 处理jsp的方式

  • 将.jsp 用JspServlet编译成html通过resp 输出到浏览器;
  • 渲染器:将jsp转换为html 通过resp响应给浏览器

  • jsp可以嵌入java代码 

  • <% java代码 %> <%= 表达式 %>

  1. 渲染的过程??

    1. jsp本质就是一个servlet

    2. JspServlet:

    3. 在客户端第一次请求jsp时;tomcat将jsp翻译为servlet 编译成java后的结果放到work目录

  2. tomcat通过默认的web.xml里的默认配置 JspServlet 来将first.jsp编译成first_jsp.java

java代码直接解析到servlet 给服务器看;html被servlet被渲染成html代码解析到浏览器; 

实际上是用Service 处理jsp中的代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
让我们逐个比较这些概念: 1. 静态包含和动态包含: - 静态包含是指在JSP页面中使用`<%@ include file="filename.jsp" %>`语法将另一个JSP文件的内容嵌入到当前页面中。这是在编译时进行的,嵌入的内容会被当作当前页面的一部分。 - 动态包含是指使用`<jsp:include page="filename.jsp" />`标签在运行时包含另一个JSP文件的内容。这是在运行时进行的,嵌入的内容会被动态地加载和执行。 2. 转发重定向: - 转发(forward)是指在服务器端将请求从一个资源发送到另一个资源,新资源接收到请求后可以共享同一个请求和响应对象。转发是在服务器内部完成的,客户端并不知道转发的过程。 - 重定向(redirect)是指在服务器端将请求响应给客户端,并在响应头中指示客户端重新发送请求到另一个URL。重定向会导致浏览器发起新的请求,对于客户端来说是完全透明的。 3. Session与Cookie: - Session是在服务器端用于跟踪用户会话状态的机制,通过在服务器上存储会话数据,并将唯一的会话标识符发送给客户端的Cookie来实现。Session可以存储在服务器的内存中或持久化到数据库中。 - Cookie是一小段文本信息,由服务器发送给客户端并存储在客户端的浏览器中。浏览器在后续请求中会自动将Cookie发送给服务器。Cookie可以用于存储少量的用户数据,如登录状态、偏好设置等。 4. JSPServlet: - JSPJavaServer Pages)是一种用于开发Web应用程序的Java技术,它允许在HTML中嵌入Java代码。JSP页面在服务器端被编译成Servlet,并在每次请求时动态生成HTML响应。 - Servlet是用Java编写的服务器端组件,它接收HTTP请求并生成HTTP响应。Servlet可以处理各种类型的请求,如GET、POST等,并与数据库、其他Web服务进行交互。 5. JPA与Hibernate: - JPA(Java Persistence API)是Java EE中定义的一套用于访问关系型数据库的API标准。它提供了一种面向对象的持久化模型,可以通过JPA进行对象关系映射(ORM)操作。 - Hibernate是一个开源的Java持久化框架,实现了JPA规范。它提供了强大的对象关系映射功能,使开发人员能够以面向对象的方式操作数据库。 6. JSF与Struts: - JSF(JavaServer Faces)是Java EE中的一个Web应用程序框架,用于构建用户界面。它采用组件化的方式,提供了丰富的用户界面组件和事件模型,简化了Web应用程序的开发。 - Struts是一个开源的Java Web应用程序框架,它基于模型-视图-控制器(MVC)设计模式。Struts提供了一种结构化的方式来组织和管理Web应用程序,包括请求处理、表单验证等功能。 这些概念都是在Java Web开发中经常使用的重要概念,根据具体的需求和场景选择合适的技术和机制可以提高开发效率和应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值