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中的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值