JSP~~

概念: Java Server Pages,Java服务端页面

一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容

JSP = HTML + Java

JSP的作用:简化开发,避免了在Servlet中直接输出HTML标

1,JSP脚本

1.1 导入JSP坐标

        <!--jsp-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>

1.2 创建JSP文件

1.3 编写HTML标签和java代码

<body>
    <h1>JSP,Hello World</h1>
    <%
        System.out.println("hello,jsp~~");
    %>
</body>

2,JSP原理

概念: Java Server Pages,Java服务端页面

JSP = HTML + Java,用于简化开发的

JSP本质上就是一个Servlet

JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个字节码文件

3,JSP脚本

JSP脚本用于在JSP页面内定义Java代码

JSP脚本分类:

1,<%...%>:内容会直接放到_jspService()方法之中

    <%
        System.out.println("hello,jsp~~");
        int i=3;
    %>

2,<%=...%>:内容会放到out.print()中,作为out.print()的参数

    <%="hello"%>
    <%=i%>

3,<%!...%>:内容会放到_jspService()方法之外,被类直接包含

    <%!
        void show(){}
        String name="zhangsan";
    %>

3.1 案例

要求,使用jsp生成如下表格

    <%
    //查询数据库
    List<Brand> brands = new ArrayList<Brand>();
    brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
    brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
    brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));

    %>

    <%
        for (int i=0;i<brands.size();i++){
            Brand brand = brands.get(i);

    %>
    <tr align="center">
        <td><%=brand.getId()%></td>
        <td><%=brand.getBrandName()%></td>
        <td><%=brand.getCompanyName()%></td>
        <td><%=brand.getOrdered()%></td>
        <td><%=brand.getDescription()%>,好吃不上火</td>

        <%
            if (brand.getStatus() == 1){
                //显示启用
        %>
        <td><%="启用"%></td>
        <%    }else{
                //显示禁用
        %>
        <td><%="禁用"%></td>
        <%
            }
        %>
        <td><a href="#">修改</a> <a href="#">删除</a></td>
    </tr>
    <%
        }
    %>

4,JSP缺点

由于JSP页面内,既可以定义HTML标签,又可以定义Java代码,造成了以下问题:

1.书写麻烦:特别是复杂的页面

2.阅读麻烦

3.复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE...

4.占内存和磁盘:JSP会自动生成,java和.class文件占磁盘,运行的是.class文件占内存

5.调试困难:出错后,需要找到自动生成的.java文件进行调试

6.不利于团队协作:前端人员不会Java,后端人员不精HTML

7. .

 5,EL表达式

Expression Language表达式语言,用于简化JSP页面内的Java代码

主要功能:获取数据

语法: ${expression}

${brands}∶获取域中存储的key为brands的数据

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.准备数据
        List<Brand> brands = new ArrayList<Brand>();
        brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
        brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
        brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));

        //2.存储到request域中
        req.setAttribute("brands",brands);

        //3.转发到el-demo.jsp
        req.getRequestDispatcher("/el-demo.jsp").forward(req,resp);
    }




<body>

    ${brands}//${brands}∶获取域中存储的key为brands的数据

</body>

利用el表达式,可以简化代码

JavaWeb中的四大域对象:

1. page:当前页面有效

2. request:当前请求有效

3. session:当前会话有效

4. application:当前应用有效

el表达式获取数据,会依次从这4个域中寻找,直到找到为止

6,JSTL标签

JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码

6.1 JSTL快速入门

6.1.1 导入坐标

        <!--jstl-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

6.1.2 在JSP页面上引入JSTL标签库

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

6.1.3 使用

  <%--
    c:if: 用来进行逻辑判断,替换java中的  if else
  --%>
  <c:if test="true">
    <h1>true</h1>
  </c:if>

  <c:if test="false">
    <h1>false</h1>
  </c:if>

6.2 <c:if>标签

  //因为status传入的数据为1,故当${status}判断为真的情况下会输出
  //如下,会输出 启用
  <c:if test="${status == 1}">
    启用
  </c:if>

  <c:if test="${status == 0}">
    禁用
  </c:if>


  req.setAttribute("status",1);

6.3 <c:forEach>

6.3.1 forEach类

<c:forEach>:相当于for循环

items:被遍历的容器

var:遍历产生的临时变量

varStatus:遍历状态对象

    //${brands}为items,brand为var
    <c:forEach items="${brands}" var="brand">
      <tr align="center">
        <td>${brand.id}</td>
        <td>${brand.brandName}</td>
        <td>${brand.companyName}</td>
        <td>${brand.ordered}</td>
        <td>${brand.description}</td>
        <c:if test="${brand.status == 1}">
          <td>启用</td>
        </c:if>
        <c:if test="${brand.status != 1}">
          <td>禁用</td>
        </c:if>
        <td><a href="#">修改</a> <a href="#">删除</a></td>
      </tr>

    </c:forEach>

varStatus:可以替代原来的<td>${brand.id}</td>,便于修改id,不会出现0 1 3的情况

其中status.index代表从0开始

status.count代表从1开始

<c:forEach items="${brands}" var="brand" varStatus="status">

    //<td>${brand.id}</td>
    <td>${status.index}</td>//status.index代表从0开始
    <td>${status.count}</td>//status.count代表从1开始

6.3.2 普通for循环类

<c:forEach begin="0" end="10" step="1" var="i">
    ${i}
</c:forEach>

<c:forEach begin="0" end="10" step="1" var="i">
  ${i}<br>
</c:forEach>

7,MVC模式和三层架构

7.1 MVC模式

MVC是一种分层开发的模式,其中:

M: Model,业务模型,处理业务

V: View,视图,界面展示

C: Controller,控制器,处理请求,调用模型和视图

MVC好处:

职责单一,互不影响

有利于分工协作

有利于组件重用

7.2 三层架构

数据访问层:对数据库的CRUD基本操作

业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能

表现层:接收请求,封装数据,调用业务逻辑层,响应数据

 8,案例

8.1 查询所有

selectAllServlet:

    private BrandService service = new BrandService();

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

        //1.调用BrandService完成查询
        List<Brand> brands = service.selectAll();

        //2.存入request中
        req.setAttribute("brand",brands);

        //3.转入brand.jsp中
        req.getRequestDispatcher("/brand.jsp").forward(req,resp);

    }

BrandService:

public class BrandService {
    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

    //查询所有
    public List<Brand> selectAll(){
        //调用BrandMapper的selectAll方法

        //2.获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.调用方法
        List<Brand> brands = mapper.selectAll();
        //5.释放资源
        sqlSession.close();

        return brands;
    }

    //添加
    public void add(Brand brand){
        //2.获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4.调用方法
        mapper.add(brand);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

    //修改
    public Brand selectById(int id){

        //2.获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.调用方法
        Brand brand = mapper.selectById(id);
        //5.释放资源
        sqlSession.close();

        return brand;
    }

    //修改
    public void update(Brand brand){
        //2.获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4.调用方法
        mapper.update(brand);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }
}

SqlSessionFactoryUtils:

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

updateService:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理post乱码的请求问题
        req.setCharacterEncoding("utf-8");

        //1.处理提交表单的数据,封装为另一个Brand对象
        String id=req.getParameter("id");
        String brandName = req.getParameter("brandName");
        String companyName = req.getParameter("companyName");
        String ordered = req.getParameter("ordered");
        String description = req.getParameter("description");
        String status = req.getParameter("status");
        
        //封装为新对象
        Brand brand = new Brand();
        brand.setId(Integer.parseInt(id));
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(Integer.parseInt(ordered));
        brand.setDescription(description);
        brand.setStatus(Integer.parseInt(status));

        //调用service,完成修改
        service.update(brand);

        //3.转发查询所有
        req.getRequestDispatcher("/selectAllServlet").forward(req,resp);
    }

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值