JavaWeb

JavaWeb笔记

1、HelloServlet

  • Servlet就是sun公司开发动态web的技术

  • sun在这些APi中提供一个接口:Servlet

    • 编写一个类,实现Servlet接口

    • 开发好的java类部署到web服务器

把实现Servlet接口的java程序叫做Servlet

  • idea部分快捷键

ctrl+shift+alt:多行操作
psvm:生成main()方法;
fori:生成for循环;
Ctrl+Alt+v:自动补齐返回值类型
ctrl+o:覆写方法
ctrl+i:实现接口中的方法
ctrl+shift+u:大小写转换
CTRL+SHIFT+Z:取消撤销
Alt+Insert:生成构造方法、getter、setter
ctrl+y:删除当前行
Ctrl+Shift+J:将选中的行合并成一行
ctrl+g:定位到某一行
Ctrl+Shitft+向下箭头:将光标所在的代码块向下整体移动
Ctrl+Shift+向上箭头:将光标所在的代码块向上整体移动
Alt+Shift+向下箭头:将行向下移动
Alt+Shift+向上箭头:将行向上移动
Ctrl+F:在当前文件中查找
Ctrl+R:替换字符串
Ctrl+Shift+F:在全局文件中查找字符串
Ctrl+Shift+R:在全局中替换字符串
Ctrl+Shift+Enter:自动补齐{}或者分号;
Shift+Enter:在当前行的下方开始新行
Ctrl+Alt+Enter:在当前行的上方插入新行
Ctrl+Delete:删除光标所在至单词结尾处的所有字符

ctrl+鼠标左键 查看该类的方法

1.1 HelloServlet

  • 构建maven项目
  • 导入依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>


    </dependencies>
  • 解决maven资源导包问题
 <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
  • 创建一个javawebServlet-01-helloServlet模块,使其变为web项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X3szlguM-1635061152611)(image-20211020211504109.png)]

  • 编写Servlet类
public class HelloServlet extends HttpServlet {
    //由于get和post只是请求实现方式不同,可以相互调用,业务逻辑相同
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        PrintWriter writer= resp.getWriter();//响应流
        writer.print("HelloServlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • 编写Servlet映射(web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--注册Servlet-->

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.wang.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--Servlet请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
  • 配置Tomcat

用Tomcat9

注意尽量使用Tomcat9,用10的话容易出现导包问题

  • 启动测试

1.2 Servlet运行原理

1.3 Mapping

  • 一个Servlet可以指定多个映射路径
  <!--Servlet请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
  • 可以使用通配符 *

  • 可以自定义后缀

   <!--指定后缀,如果是下面这种类型不能加/-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
  • 优先级

如果指定了固有的路径优先级最高

 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <!--指定后缀,如果是下面这种类型不能加/-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

   
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

对比一下,运行的时候我们输入hello,到底走HelloServlet还是ErrorServlet

测试后发现,我们走的是HelloServlet

可以对比发现,固有的路径优先级高

2、ServletContext

web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,他代表当前的web应用

2.1 共享数据

在这个servlet保存的数据,可以在另一个Servlet使用

在HelloServlet类中(放置数据)

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello");
        //获取ServletContext对象
        ServletContext context=this.getServletContext();
        String username="wang";
        //将username以键值对的形式放入ServletContext
        context.setAttribute("username",username);
    }
}

在GetUsername类(获取数据)

public class GetUsername extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context=this.getServletContext();
        //ServletContext本身是object类型,由于获取的对象是String类型,所以我们需要强转
        String username=(String) context.getAttribute("username");
        resp.getWriter().print(username);
    }
}

不要忘了注册servlet

我们发现运行HelloServlet后,再次运行Getusername,数据就实现了共享

可见ServletContext在我们所有Servlet类之上

2.2 获取初始化参数

web.xml

   <!--设置初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>www.baidu.com</param-value>
    </context-param>

在web.xml中配置好我们的初始化参数

编写一个Servlet类(GetParam)

public class GetParam extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context=this.getServletContext();
        //括号里的url使我们设置初始化数据的名字
        String url=context.getInitParameter("url");
        resp.getWriter().print(url);
    }
}

记得注册Servlet

我们获取到的初始参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cmQPa6Wz-1635061152615)(image-20211021144601612.png)]

2.3 请求转发

将我们一个Servlet的数据转发到另一个Servlet

编写一个Servlet(ReGet)

public class Reget extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context=this.getServletContext();
        //设置请求转发的路径(Servlet路径,将getParam的数据转发到reGet)
       RequestDispatcher dispatcher= context.getRequestDispatcher("/getParam");
        //设置请求转发
        dispatcher.forward(req,resp);
    }
}

记得注册

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUSAvlnT-1635061152617)(image-20211021150536392.png)]

2.4 读取资源文件

编写servlet(Getpop)

public class Getpop extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context=this.getServletContext();
        //相对路径(使用我们生成的项目的路径,就是target包)
        InputStream in=context.getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties pop=new Properties();
        pop.load(in);
        String user=pop.getProperty("username");//以键值对获取
        String pwd=pop.getProperty("password");
        resp.getWriter().print(user+pwd);
    }
}

在resource目录下编写db.properties

username=root
password=123456

注册servlet

运行测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6wwYKF5-1635061152619)(image-20211021175218830.png)]

3、HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建了一个代表请求的HttpServletRequest和和代表响应的HttpServletResponse

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应信息:找HttpServletResponse

3.1 方法分类

  • 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;//流

PrintWriter getWriter() throws IOException;//可以发送中文
  • 负责向浏览器发送设置响应头的方法
//设置编码
void setCharacterEncoding(String var1);

void setContentLength(int var1);

void setContentLengthLong(long var1);
//设置网页的形式(可以是html或者imge等)
void setContentType(String var1);

void setBufferSize(int var1);

void setDateHeader(String var1, long var2);

void addDateHeader(String var1, long var2);
//这个方法比较重点
void setHeader(String var1, String var2);

void addHeader(String var1, String var2);

void setIntHeader(String var1, int var2);

void addIntHeader(String var1, int var2);

void setStatus(int var1);
  • 响应的状态码
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

200:请求成功

3xx:请求重定向

4xx:找不到资源

5xx:服务器端代码错误

502:网关错误

3.2 常见应用(下载)

  • 向浏览器输出消息
 PrintWriter writer= resp.getWriter();
  • 下载文件

    ​ 1、要获取下载文件路径

    ​ 2、下载的文件名

    ​ 3、设置让浏览器支持下载我们需要下载的东西

    ​ 4、获取下载文件的输入流

    ​ 5、创建缓冲区

    ​ 6、获取OutputStream对象

    ​ 7、将FileOutputStream流写入缓冲区

    ​ 8、使用Outputstream将缓冲区的数据输出到客户端

public class FileDown extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        //1、要获取下载文件路径
        String file="G:\\IDEA\\workspace\\JavaWeb\\servlet-03-response\\src\\main\\resources\\1.png";
        //2、下载的文件名
        String filename=file.substring(file.lastIndexOf("\\")+1);
        //3、设置让浏览器支持下载我们需要下载的东西
        resp.setHeader("Content-disposition","attachment;filename"+URLEncoder.encode(filename,"UTF-8"));
        //4、获取下载文件的输入流
        FileInputStream in=new FileInputStream(file);
        //5、创建缓冲区
        int len=0;
        byte[] buffer=new byte[1024];
        //6、获取OutputStream对象
        ServletOutputStream out=resp.getOutputStream();
        //7、将FileOutputStream流写入缓冲区  8、使用Outputstream将缓冲区的数据输出到客户端
        while ((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        //9、关闭
        in.close();
        out.close();
    }
}

3.3 验证码

主要就是让浏览器自动刷新

public class VerificationCode extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //浏览器5秒刷新一次
        resp.setHeader("refresh","5");
        //设置向浏览器响应的文件类型(文本类型)
        resp.setContentType("text/html");
        //浏览器有缓存,设置没有缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        //输出
        PrintWriter writer=resp.getWriter();
        writer.print(getNum());
    }
    //生成随机数
    private int getNum(){
        Random random=new Random();
        int num=random.nextInt(9999999);//7位数
        return num;
    }
}

3.4 重定向

一个web资源收到客户端请求后,他会通知客户端去访问另一个web资源,这个过程就叫重定向

  • 常见场景

    用户登录

sendRedirect这个方法实现重定向

 void sendRedirect(String var1) throws IOException;
public class Redirect extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //跳转到getCode  一定要注意路径问题
       resp.sendRedirect("/s3/getCode");
    }

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

  • 重定向和请求转发的区别

    1、请求转发时,url不会变化 状态码 307

    2、重定向时,url会变化 状态码 302

4、HttpServletRequest

获取客户端的信息

4.1 获取前端传递的参数

String getParameter(String var1);

Enumeration<String> getParameterNames();

String[] getParameterValues(String var1);

Map<String, String[]> getParameterMap();

  • 我们先编写index.jsp
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1 style="text-align: center">登录</h1>
  <%--以post方式传递表单--%>
  <form style="text-align: center" action="${pageContext.request.contextPath}/login" method="post">
    名字:<input type="text" name="username"><br>
    密码:<input type="password" name="pwd"><br>
    爱好:<input type="checkbox" name="hobbys" value="1">1
    <input type="checkbox" name="hobbys" value="2">2
    <input type="checkbox" name="hobbys" value="3">3
    <input type="checkbox" name="hobbys" value="4">4
    <input type="checkbox" name="hobbys" value="5">5
    <br>
    <input type="submit" value="提交">
  </form>
  </body>
</html>

  • servlet类(Login)
public class Login extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        String username=req.getParameter("username");
        String pwd=req.getParameter("pwd");
        //以数组形式获取表单信息
        String hobbys[]=req.getParameterValues("hobbys");
        System.out.println(username+","+pwd);
        for(String hobby: hobbys){
            System.out.println(hobby);
        }
    }

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

4.2 请求转发

  • 在4.1基础上我们添加一个success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
  • 在我们的Login类中的doGet方法添加
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);

注意请求转发的路径,与重定向不同

自行测试

5、Cookie、Session

5.1 会话

会话:用户打开一个浏览器,点击很多超链接,访问web资源,关闭浏览器,这个过程就是会话

保存会话的两种技术cookie和session

cookie

  • 客户端技术(响应、请求)

session

  • 服务器技术,可以保存用户的会话信息。我们可以将会话信息存放在session中

  • 常见用处:网站登录之后,下次不需要输入账号和密码就能登录

5.2 Cookie

主要的几个方法

//创造一个cookie
new Cookie();
//设置cookie存在周期
cookie.setMaxAge();
//给浏览器响应一个cookie
resp.addCookie(cookie);
//获取cookie的键(key ---》  name)
cookie.getName();
//获取cookie的值(value)
cookie.getValue()  
  • 看测试
public class Cookie01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //解决中文乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();

        //new一个cookie    System.currentTimeMillis()获取当前时间
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
        //给cookie设置存在时间(一天)
        cookie.setMaxAge(24*60*60);
        //给浏览器响应一个cookie
        resp.addCookie(cookie);


        //在从浏览器获取cookie
        Cookie[] cookies = req.getCookies();
        //将cookie输出到浏览器
        for (Cookie cookie1:cookies){
            if(cookie1.getName().equals("LastLoginTime")){
                //一系列转化   最后转化为时间
                long l = Long.parseLong(cookie1.getValue());
                Date date = new Date(l);
                writer.write(date.toLocaleString());
            }
        }


    }

解释都在注释里面

注意点:

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个Cookie,浏览器上限300个cookie
  • Cookie大小限制4kb

删除Cookie

  • 不设置有效期,关闭浏览器,自动失效;
  • 设置有效期时间为0;

Cookie并不是很安全

使用Cookie也可以传递中文数据

但是设置的value值尽量使用URLEncoder.encode()

Cookie cookie = new Cookie("LastLoginTime",URLEncoder.encode("王","utf-8"));

缺一不可(解决乱码的方式)

URLEncoder.encode()是进行编码

URLDecoder.decode()时进行解码

5.3 Session(重点)

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Sesssion就存在
  • 保存信息

用户每次打开浏览器,后台服务器就会创建一个Session对象给浏览器,直到浏览器关闭,或者手动注销Session。

Session和Cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器中保存(可以保存多个)

  • Session是将用户的数据写到用户独占的Session中,服务器端保存(保存重要信息,减少服务器资源)

  • Session是由服务器创建

Session使用场景:

  • 保存用户的登录信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存到Seeion中

Session的一些方法:

long getCreationTime();

String getId();

long getLastAccessedTime();

ServletContext getServletContext();

void setMaxInactiveInterval(int var1);

int getMaxInactiveInterval();

/** @deprecated */
@Deprecated
HttpSessionContext getSessionContext();

Object getAttribute(String var1);

/** @deprecated */
@Deprecated
Object getValue(String var1);

Enumeration<String> getAttributeNames();

/** @deprecated */
@Deprecated
String[] getValueNames();

void setAttribute(String var1, Object var2);

/** @deprecated */
@Deprecated
void putValue(String var1, Object var2);

void removeAttribute(String var1);

/** @deprecated */
@Deprecated
void removeValue(String var1);

void invalidate();

boolean isNew();
  • 部分方法测试
public class Session01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        //输出对象方法
        PrintWriter writer = resp.getWriter();
       /* 获取Session(由于是服务器给客户端(浏览器)创建Session对象,
            所以我们只能从客户端获取Session,所以使用request)
        */
        HttpSession session = req.getSession();
        //给Seesion设置一些值
        session.setAttribute("name","王");


        //将SessionId输出到浏览器
        writer.write(session.getId());
        //判断Session是不是新的
        writer.print(session.isNew());
        //输出我们设置的值
        writer.print((String)session.getAttribute("name"));



    }

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

  • 注销Session

    注销session就相当于重新打开浏览器,如果我们没有关闭浏览器服务器会立刻给我们生成一个新的session

    1、在我们的Servlet类中注销

    //注销session
    session.invalidate();
    

    2、在我们web.xml中配置Session失效时间(会话自动过期)

    <session-config>
        <!--以分钟为单位-->
        <session-timeout>1</session-timeout>
    </session-config>
    

6、JSP

就是我们的Servlet

6.1 jsp基础语法

  • jsp表达式(<% %>内写java代码)

    <%--jsp表达式--%>
        
      <%--
      将程序结果输出到客户端
      <%=变量或表达式%>
      --%>
        
      <%=new Date()%>
          
      <%--jsp脚本片段--%>
      <%
        int sum=0;
        for (int i=1;i<=100;i++){
          sum+=i;
        }
        out.println("<h1>"+sum+"</h1>");
      %>
    
      <%--可以在代码中嵌入html元素 输出5个hello--%>
      <%
        for(int i=1;i<=5;i++){
      %>
        <h1>hello  <%=i%></h1>
      <%
        }
      %>
    
    
      <%--
        <%!%>可以定义全局变量(jsp声明)
      --%>
    <%!
        static {
          System.out.println("Loading");
        }
    %>
    

jsp声明是将变量或表达式定义在jsp生成的类中

其他都是定义在jsp生成类中的方法里

jsp声明作用域较高

  • EL表达式

    **${} ** 也可以输出值,取出值

  • jsp注释在客户端无法看到 而html注释却可以看到

6.2 jsp指令

<%@ %>

<%@ page %>

<%@ include %>  (嵌入其他页面)
  • 定制错误页面

    • 在jsp页面中配置

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%--发生出错误就跳转到erroe.jsp--%>
      <%@ page errorPage="error.jsp" %>
      <html>
      <head>
          <title>test</title>
      </head>
      <body>
      
      <%  
          int i=1/0;
      %>
      </body>
      </html>
      
    • 在web.xml文件中配置

      <error-page>
          <error-code>404</error-code>
          <location>/404.jsp</location>
      </error-page>
      

6.3 九大内置对象

  • PageContext
  • Request
  • Response
  • Sesssion
  • Application (ServletContext)
  • Config (ServletConfig)
  • out
  • page
  • Exception
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>内置对象</title>
</head>
<body>

<%--内置对象--%>
<%
    /*保存值*/
    pageContext.setAttribute("name1x","王炸1");//保存的数据只在一个页面中有效
    request.setAttribute("name2x","王炸2");//保存的数据只在一次请求中有效,请求转发会携带该数据
    session.setAttribute("name3x","王炸3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4x","王炸4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

<%
  /*方法一:取出值*/
    String name1=(String) pageContext.getAttribute("name1x");
    String name2=(String)request.getAttribute("name2x");
    String name3=(String)session.getAttribute("name3x");
    String name4=(String)application.getAttribute("name4x");
%>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>


<%
    /*方法二:findAttribute  从底层找到高层(作用域)*/
    String name11=(String) pageContext.findAttribute("name1x");
    String name12=(String) pageContext.findAttribute("name2x");
    String name13=(String) pageContext.findAttribute("name3x");
    String name14=(String) pageContext.findAttribute("name4x");

%>

<h2>${name11}</h2>
<h2>${name12}</h2>
<h2>${name13}</h2>
<h2>${name14}</h2>


</body>
</html>

作用域:

page<request<session<application

6.4 jsp标签、jstl标签、EL表达式

需要导包

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>

<!--标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

EL表达式: ${}

  • 获取数据
  • 执行运算
  • 获取web开发对象

jsp标签

  • <%--引入其他jsp文件--%>
    <jsp:include page="error.jsp"></jsp:include>
    
  • <%--转发--%><%--还可以携带参数--%>
    <jsp:forward page="JspTag2.jsp">
        <jsp:param name="name" value="汪涵桑"/>
    </jsp:forward>
    
    <%
    	//取出参数
        String name=request.getParameter("name");
        out.write(name);
    %>
    

Jstl表达式:

  • 核心标签
  • 格式化标签
  • SQL 标签
  • XML 标签
  • JSTL 函数

我们只需要了解核心标签即可

使用核心标签需要导入头文件

<%--引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6lYgl6p-1635061152621)(image-20211024132123562.png)]

在我们测试中发现一个错误

  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

如果我们包导的没有问题,这种情况我们就需要手动往Tomcat的lib文件下导入jstl和standard这两个包

<body>
    <form action="JstlTag.jsp" method="get">
        <%--使用EL表达式获取数值--%>
        <input type="text" name="username" value="${param.username}">
        <input type="submit" value="提交">
    </form>

<%--若登录的是admin,我们就让他登录成功--%>
    <%--第一种使用jstl标签--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="欢迎您"/>
</c:if>
<c:out value="${isAdmin}"></c:out>

    <%--第二种,使用java代码--%>
<%
    if(((String)request.getParameter("username")).equals("admin")){
        out.write("欢迎");
    }
%>
    
    
    
    <%--定义一个变量--%>
<c:set var="scode" value="23"></c:set>
</body>

7、MVC三层架构

MVC:Model view Controller(模型,视图,控制器)

  • Controller

    控制器

    Servlet层

    • 接受用户请求
    • 响应客户端内容
    • 重定向或转发(视图跳转)
  • View

    视图层

    Jsp

    • 展示数据
    • 提供用户操作

由于Servlet和JSP都可以写java代码,为了便于维护我们尽量做出一些规范

Servlet专注于请求

JSP专注于显示数据

  • 业务层(Service)

    用于完成业务操作(登录,查询等)

  • JavaBean(dao)

    连接数据库,CRUD

Model包括业务层和Dao(JavaBean)层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3dDAFAb-1635061152622)(image-20211024145741713.png)]

8、Filter

Filter:过滤器

  • 处理中文乱码
  • 登录验证。。。。

测试

  • 编写一个过滤器

    public class EncodingFiler implements Filter {
        //初始化  服务器只要一启动就开始初始化
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("过滤器初始化");
        }
    
        //实现过滤的内容
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html");
            //这个必须写,否则无法是程序运行下去
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        //销毁   只有服务器关闭时才销毁
        public void destroy() {
            System.out.println("过滤器销毁");
        }
    }
    
  • 编写一个Servlet

    public class TestServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().print("我是人类");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
  • 在web.xml中配置过滤器

<servlet>
    <servlet-name>testServlet</servlet-name>
    <servlet-class>com.wang.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/testServlet</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.wang.filter.EncodingFiler</filter-class>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <servlet-name>testServlet</servlet-name>
</filter-mapping>

可以自行测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ星小天才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值