JSP技术简介
- jsp --- Java Server Pages (java 服务器端的网页)
- JSP可以编写 HTML代码+Java代码+JSP的代码
- JSP的执行原理:jsp第一次访问的时候,把JSP的文件翻译成.java的文件,编译成.class的文件,执行
- 编写JSP的脚本元素 <%! %> <%= %> <% %>
- JSP和servlet在程序中开发的角色
1.JSP model1的时代
2.JSP(收集用户输入的数据,显示数据给用户)+ servlet(接收和相应请求)
JSP的指令
-
page指令
- 通过page指令设置JSP文件的属性
- page语法:<%@ page 属性名称=属性值 属性名称=属性值 %>
- page指令的属性
- 1. language ----默认翻译成什么语言
- 2.extends --继承(一个jsp的文件翻译成.java文件,默认继承一个类)
- 3.session --默认时true,可以直接使用session
- 4.import ---导入包。可以出现多次,其他属性只能出现一次
- 5.buffer --设置输出缓冲区的大小,默认是8kb
- 6.autoflush ---如果缓存区满了,是否自动刷新,如果满了不刷新,就会抛出异常
- 7.errorPage --程序抛出异常,直接把异常抛到页面上。可以指定错误的处理页面 errorPage="/error/error.jsp"
- 8.isErrorPage --需要在错误的页面使用,决定直接可以使用exception
- 9.isELIgnored --是否忽略EL表达式,默认是false
- 10.pageEncoding --设置当前页面的编码,JSP的文件翻译成.java文件
- 11.ContentType --浏览器默认打开文件的编码
- 当页面只设置了10和11中的一个,另一个默认和这个相同
- 在web.xml配置全局的错误页面 <error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page>
-
include指令
- include指令:可以用于页面包含,把几个页面放在一起对外显示
- 指令的语法:<%@ include file="" %>
- 静态包含:原理:将包含文件的所有内容复制过来,一起翻译成一个.java文件然后编译成.class文件
JSP的内置对象
1.概念:可以直接使用。exception对象,page指令有一个属性,isErrorPage设置true才能使用exception对象
2.内置对象
request HttpServletRequset
response HttpServletResponse
session HttpSession
application ServletContext
out JspWriter
pageContext PageContext
page Object(代表当前对象)
config ServletConfig
exception Throwable
3.out对象,真实的对象是JspWriter,可以向页面输出内容,PrintWriter response.getWriter();这两个对象之间的联系?
<%= "HELLO" %> <% out.print("AAAA"); %> <% response.getWriter().print("BBBB"); %>
<% out.print("CCCC"); %> 输出结果是:BBBB HELLO AAAA CCCC 因为会把out缓存区的东西先放到respnse缓冲区,然后一起输出到客户端
4.pageContext对象
- 这一个对象顶9个,因为可以获取另外8个对象
- 域对象:代表当前页面的域
- 向其他域对象存取值
- pageContext对象的API
- setAttribute(String name , Object value) 向pageContext域对象存入值
- setAttribute(String name,Object value, int scope) 向指定域存入值
- Object getAttribute(String name) 从pageContext域对象取值
- Object getAttribute(String name,int scope) 从指定域对象取值
- Object findAttribute (String name ) 全域查找 (默认从最小域开始找)
- 作用:编写框架的时候 自定义标签的时候 编写通用性较高的代码
JSP标签
- <jsp:forward> 转发的功能 page属性:转发到哪个页面 路径:服务器绝对路径(不包含项目名称)
- <jsp:param> 转发的时候可以传递参数 写到<jsp:forward>标签中间
- <jsp:include> 动态包含(和静态包含结果是一样的,原理是不同的)
在源码的文件下,生成了4个.java 和 .class 文件
原理:将各个部分分别翻译编译,然后将结果合并到一起
JavaBean
规范: 1.这个java类必须有无参构造方法 2.属性私有化 3.提供public get set方法(有一个就行)
作用:封装数据
JavaBean的属性:是由get或者set方法来决定 有get或set方法,没有变量 也是JavaBean的属性
内省的技术:
- 通过内省的技术,可以操作JavaBean的属性的读写方法
- 原理:
//从页面获取数据存储到map 没有处理数据类型,只能接收String类型
Map<String,String[]> map = request.getParameterMap();
//创建JavaBean对象
User user = new User();
//封装数据(内省原理)
try{
populate(user,map);
}catch(Exception e){
e.printStackTrace();
}
populate(User user, Map<String , String[]> map) throws Exception{
//数据封装
BeanInfo info = Introspector.getBeanInfo(user.getClass());
//获取属性的信息
PropertyDescriptor[] pds = info.getPropertyDescriptors();
//循环遍历
for(PropertyDescriptor pd : pds){
//表单中的name属性的值和javabean中属性如果要是相同,就封装
//获取熟悉的名称
String proName = pd.getName();
//map中的key是否和属性的名称相同,如果相同,封装数据
if(map.containsKey(proName)){
//获取属性的写方法
Method m = pd.getWriteMethod();
//执行写方法
m.invoke(user,map.get(proName)[0]);
}
}
}
内省技术的工具类:
BeanUtils工具类,需要两个jar包 (页面name要和bean中的变量名相同)
- commons-beanutils-1.8.3.jar
- commons-logging-1.1.1.jar
- 如果有日期类型,需要编写字符串转日期代码:1.需要编写类,实现Converter接口,重写一个方法(字符串转日期) 2.使用ConvertUtils.register()注册
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
Map<String,String[]> map = request.getParameterMap();
//将数据封装到这个bean中
User user = new User();
//注册:遇到Date类型,按照我写的传入对象的方式来解决
ConvertUtils.register(new MyConverter(), Date.class);
//使用beanutil进行封装
try {
BeanUtils.populate(user, map);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}
//转换格式的类
public class MyConverter implements Converter{
/**
* obj:用户输入的数据
*/
public Object convert(Class clazz, Object obj) {
//把obj转换字符串
String str = (String) obj;
//把字符串转日期格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("日期转换错误");
}
return date;
}
}