jsp标准和标签库
jsp标准的标签库语言(第三方写好的)
- 作用:代替jsp脚本
- 使用:
导入两个jar包 (jstl.jar和standard.jar)
在页面上导入标签库
<%@taglib prefix="" uri=""%>
例如:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl的分类
core:核心库
fmt:格式化|国际化
xml:过时了
sql:过时了
函数库:很少使用了
core掌握
if
forEach
c:if判断
<%--比较大小--%>
<c:if test="${3>4}">
3大于4
</c:if>
<c:if test="${3<=4}">
3不大于4
</c:if>
<%--判断是否登录成功--%>
<c:if test="${not empty name}">
${name}+欢迎来到主页
</c:if>
<c:if test="${empty name}">
您还没有进行登录,请先登录<a href="/login.jsp">登录</a>
</c:if>
c:forEach 循环
- 格式:
<c:forEach begin=“从哪里开始” end=“到哪里结束” stop=“步长” var=“给变量起名字” varStatus=“循环状态变量”>
i − − {i }-- i−−{vs.count }–${vs.current }
</c:forEach> - varStatus:用来记录循环的状态
常用的属性:
count:记录次数,从1开始
current:当前遍历的内容
index:索引从0开始
例子:
<%--list 集合--%>
<%
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("张三",1));
list.add(new Student("李四",2));
list.add(new Student("王五",3));
list.add(new Student("赵六",4));
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="ele" >
${ele.name}------${ele.age}
</c:forEach>
<%--map 集合--%>
<%
HashMap<String, Student> map = new HashMap<>();
map.put("一个歌手",new Student("邓紫棋",32));
map.put("一个演员",new Student("赵丽颖",35));
map.put("一个锦鲤",new Student("杨超越",25));
request.setAttribute("map",map);
%>
<c:forEach items="${map}" var="ele">
${map.key}<br>
${map.value.name}----${map.value.age}<br>
</c:forEach>
c:url
- 功能:
自动补全项目路径
自动url重写
<a href="${pageContext.request.contextPath}/student.jsp">student.jsp</a>
<<a href='<c:url value="/student.jsp">'>student.jsp</a>
多个标签
- set标签保存数据
<a href='<c:url value="/student.jsp">'>student.jsp</a>
<a:set var="name" value="rose" scope="request"></a:set>
<%
String msg=null;
request.setAttribute("msg",msg);
%>
${name}
${smg}
- get标签取出数据
default:当value值为null的时候,使用默认值
escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
<c:out value="${msg}" default="<h1>默认标题</h1>" escapeXml="true"></c:out>
- <%–choose标签+when标签+otherwirse标签: 多条件判断 --%>
<c:set var="score" value="69"></c:set>
<c:choose>
<c:when test="${score>=90 && score<=100}">优秀</c:when>
<c:when test="${score>=80 && score<=90}">良好</c:when>
<c:when test="${score>=70 && score<=80}">一般</c:when>
<c:when test="${score>=60 && score<=70}">及格</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
- <%-- forToken标签: 循环特殊字符串 --%>
<%
String str="在一个页面之内";
pageContext.setAttribute("str","str");
%>
<c:forTokens items="${str}" delims="-" var="s">
${s}
</c:forTokens>
<%--重定向--%>
<c:redirect url="https://www.baid.com">百度</c:redirect>
mvc
- MVC模式 一种前辈们总结出来的开发模式
M :Model 模
封装数据,处理业务逻辑
V : View 视图
界面显示
C :Controller 控制器
调度 - JavaWeb的三层架构
- org.westos.web.servlet :web层
- org.westos.service:service层
*org.westos.dao:dao层 - org.westos.domain : JavaBean
- org.westos.util:工具包
org.westos.test:测试包
- org.westos.service:service层
- 登陆注册案例
JavaBean
概念
符合特定规范的java类
特定规范
- 私有成变量
- 公共的get set 方法
- 必须有无参构造
- 实现序列化接口
javabean用来封装参数
- 分别获得各个表单项提交的参数
- 创建javabean
- 调用javabean的set方法
BeanUtils的组件
使用步骤
1.导包
2.使用
BeanUtils.populate(user,map);
注意
1.自定义日期的转换格式
DateConverter dc = new DateConverter();
2.设值日期的字符串格式
dc.setPattern(“yyyy-MM-dd”);
3.注册日期的转换器
ConvertUtils.register(dc, Date.class);
BeanUtils.populate(user, map);
注解(元数据)
概念:
- 注释:给人看的
- 注解也叫元数据,一种代码说明,给代码看的
- djk1.5之后提供的,它和类,枚举接口在用一个层次
- 它可以声明类, 成员变量,方法,局部变量,方法参数的前面,用来对这些元素进行解释说明,注释
本质
本质就是接口,接口可以定义抽象方法
接口的抽象方法=注解的属性
格式
@interface 注解名{}
作用
替代配置文件
对数据进行限定
java中常见的三个注解
@Override:加在方法上,该方法是否重写父类的
@FunctionalInterface检查一个接口是不是函数式接口
函数式接口:此接口中只有一个抽象方法
@SupperessWarnings:抑制警告,之需要一个all就可以抑制所有的警告
@Deprecated:标注一个类或者方式过期
赋值
- 方式
属性名=属性值
@MyAnnotation(value=“zhangsan”) - 如果注解的属性名只有value的时候,value可以省略
@MyAnnotation(“zhangsan”) - 可以给属性设置默认值
public @interface MyAnnotation {
int num() default 100;
String name() default “zhangsan”;
}
@MyAnnotation()//因为它有默认值,所以我们可以不用赋值
public class Test {
}
元注解
是java给我们提供的注解,它的作用就是来限定我们的自定义注解应该加在哪个位置,哪个阶段
-
规定注解应该保留到哪个位置
@Target
值为ElementType的枚举值
TYPE:作用在类 接口 等上面
METHOD:作用方法上面 @Target(ElementType.METHOD)
FIELD:作用字段上面 -
规定注解应该保留到哪个阶段
@Retention
值为RetentionPolicy的三个枚举值
SOURCE:只在代码中保留,在字节码文件中就删除了
CLASS:在代码和字节码文件中保留
RUNTIME:所有阶段都保留@Retention(RetentionPolicy.RUNTIME) -
例子
自定义注解
注解的属性:
- 注解的本质就是一个接口可以用javap反编译一下注解的字节码文件,例如:javap myan.class
- 接口中可以有常量和抽象方法,该抽象方法称之为注解的属性
- 例如
public @interface MyAnnotation{
}
注解的属性类型都支持那些类型
基本类型:四类八种,byte short int long char booolean float double
字符串类型:String
枚举类型
注释类型
字节码class类型型
数组类型
- 在注释中右哟个特殊的属性类型叫value()
- 如果单独使用value的属性的时候,value可以省略不写
- 如果注解的属性是个数组类型,那么给注解的属性赋值的时候要用{}括起来
例子
//定义数据库所需要的四参数
@Targent(ElementType.METHOD)//加在方法上
@Retention(RetentionPolicy.RUNTIME)//保留在运行阶段
public @interface JDBCAnnotation {
String driverClass() default "com.mysql.jdbc.Driver";
String url() default "jdbc:mysql://localhost:3306/hbm";
String user() default "root";
String password() default "123456";
}
@JDBCAnnotation(password = "123456")
public static Connection getConnection() throws NoSuchMethodException, ClassNotFoundException, SQLException {
//获取该类的字节码文件对象
Class clazz= JDBCUtils.class;
//获取方法的对象
Method m = clazz.getMethod("getConnection");
//判断该方法上是否有注解有的话就进行判断
boolean b = m.isAnnotationPresent(JDBCAnnotation.class)
if(b){//如果方法上面有注解就获取注解而且拿到注解的属性值
JDBCAnnotation annotation = m.getAnnotation(JDBCAnnotation.class);
//获取注解属性的值
String driverClass = annotation.driverClass();
String url = annotation.url();
String user = annotation.user();
String password = annotation.password();
Class.forName(driverClass);
return DriverManager.getConnection(url,user,password);
}
return null;
}
}