jsp-servlet篇

Posted 甘劭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jsp-servlet篇相关的知识,希望对你有一定的参考价值。

1.JSP原理分析及语法

查看 _jsp.java 源码路径: F:\\apache-tomcat-9.0.14\\work\\Catalina\\localhost\\ROOT\\org\\apache\\jsp

 

jsp和servlet 的区别:jsp 其实就是一个servlet。  在mvc模式中,jsp充当视图(view),servlet充当控制器(controller).

JSP语法

  1. 注释
    1. <!-- html注释-->    html注释,在网页源代码中可以看到
    2. <%-- jsp注释--%>   在网页源代码中看不到。
  2. 输出数据到页面     <%= hello %>

        3.JSP中的Java脚本片段

      2,3 方式都在_japService() 里面。

<%

    语句1;

    语句2;

%>

 

  4.定义类的成员 ,

<%!

    String str;

    void testMethod(){}

%>

 

JSP中写Java代码相当恶心 和 Servlet中写html代码有一拼。

 

 

2.Jsp的三大指令

1)include指令

作用: 在当前页面用于包含其他页面
语法: <%@include file=”common/header.jsp”%>
注意:
  1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件,再编译运行,这种包含叫静态包含(源码包含)
  2)抽出去的jsp中只需要<%@page ... %>   和内容即可。

 

(2)page指令

作用: 告诉tomcat服务器如何翻译jsp文件
  语法: <%@ page
      language=”java”              该属性用于设置JSP页面使用的语言,目前只支持Java语言
      import=”java.util.*”           导包,多个包之间用逗号分割 。
      pageEncoding=”utf-8”     定义JSP页面的编码格式,可解决中文乱码问题 
      contentType=”text/html; charset=utf-8” 服务器发送浏览器的数据类型和内容编码
      errorPage=”error.jsp”     当前页面发生错误跳转到错误页面。
      isErrorPage=”false”       该属性可以将当前页面定义为错误页面来处理另一个页面转发而来的错误,即异常处理。设置为true以后可以使用exception对象.
      buffer=”8kb”                  用于设置out对象所使用的缓冲区大小,默认大小是8KB,单位只能是8的倍数。
      session=”true”               定义JSP页面是否使用session会话对象,其值是boolean类型,默认值为true. 
      isELIgnored=”false”      该属性用于定义些页面是否忽略EL表达式的使用
    %>

 


(3)taglib指令

作用:导入标签库
语法:<%@taglib uri=”tld文件的uri名称” prefix=”简写” %>

 

 

3.  jsp 7个动作指令


动作指令与编译指令不间,编译指令是通知 Servlet 引擎的处理消息,而动作指令只是运行时的脚本动作。编译指令在将JSP 编译成 Servlet 时起作用:处理指令通常可替换成 Java脚本,是 JSP脚本的标准化写法。

 JSP7 个 动作指令如下 :

jsp:forward: 执行页面转向,将请求的处理转发到下一个页面。
jsp:param: 用于传递参数,必须与其他支持参数曲标签一起使用。
jsp:include: 用于动态引入一个 JSP 页面。
jsp:p1ugin: 用于下载 JavaBean 或 Applet 到客户端执行。
jsp:useBean: 使用 JavaBean。
jsp:setProperty: 修改 JavaBean 实例的属性值。
jsp:getProperty: 获取 JavaBean 实例的属性值。

 

4. JSP九大内置对象(不需要创建就可以直接使用):

  1. out  :    等同于 response.getWriter(),用来向客户端(浏览器)发送文本信息,
  2. request:    就是指HttpServletRequest类的对象
  3. response:   就是指HttpServletResponse类的对象
  4. session:     是HttpSession类的对象,
  5. application:是ServletContext类的对象
  6. page:        指当前页面的对象,类似于"this"
  7. config:       ServletConfig类的对象
  8. exception:   只能在错误页面中使用该对象,即在page指令中设置了isErrorPage="true",才可用
  9. pageContent:页面的上下文对象,是一个域对象

 

5. 谈谈JavaBean

什么是javaBean?

1. 简单理解JavaBean遵循一定的规范JAVA语言写成的可重用组件().

       1):类必须使用public修饰.

       2):必须保证有公共无参数构造器.  (一般就是可以通过反射轻松的创建对象)

       3):包含了属性的操作(给属性赋值,获取属性值). 

      注意:javaBean的属性(字段+set/get方法)

2. 广义的JavaBean:

       1):复杂:GUI,比如Button,Panel,Window.

       2):简单:domain,dao,service组件,封装数据,操作数据库,逻辑运算等.

 

3. JavaBean中的成员:

       1):方法:Method

       2):事件:event

       3):属性:property

 

4. JavaBean的自省(内省)机制

自省和反射很相似。大家都是通过字节码来映射出自身的元素!

反射映射出整个类,属性自省就映射出属性的全部,就是名字,getter 和setter 方法。

public class TestJavaBean {
    @Test
    public void test1() throws Exception{
        //static BeanInfo getBeanInfo(Class<?> beanClass);  //获取指定字节码对象的javaBean信息对象
        BeanInfo info= Introspector.getBeanInfo(Student.class,Object.class);
      PropertyDescriptor[] propertys= info.getPropertyDescriptors();//获取所有属性的描述器
        for (PropertyDescriptor pd : propertys) {
            System.out.println(pd);//打印每一个属性描述器。
            System.out.println(pd.getName());//属性对象的名称
            System.out.println(pd.getPropertyType());//属性对象的类型
            System.out.println(pd.getReadMethod());//属性对象的读方法  getXxx()
            System.out.println(pd.getWriteMethod());//属性对象的写方法  setXxx()
            System.out.println("-----------------------");
        }
    }
}    

 

5. BeanUtils工具的使用

 

开发(框架),经常使用Apache commonBeanUtils工具来操作JavaBean.

需要的JAR包

commons‐beanutils‐1.9.3.jar // 工具核心包
​
commons‐logging‐1.2.jar // 日志记录包
​
commons‐collections‐3.2.2.jar // 增强的集合包

BeanUtils常用方法

1. public static void setProperty(Object bean, String name, Object value)
//参数一: 对象,  参数二:属性名, 参数三: 属性的值。
给指定对象bean的指定name属性赋值为指定值value。
//如果指定的属性不存在,则什么也不发生。
2.public static String getProperty(Object bean, String name)
获取指定对象bean指定name属性的值。
//如果指定的属性不存在,则会抛出异常。
注意:当属性的类型是数组类型时,获取到的值数组中的第一个值。
​
3.public static void copyProperties(Object dest, Object orig)    
将对象orig的属性值赋值给对象dest对象对应的属性
注意:只有属性名名相同且类型一致的才会赋值成功。
​
4. public static void populate(Object bean, Map<String, ? extends Object> properties)
将一个Map集合中的数据封装到指定对象bean中
注意:对象bean的属性名和Map集合中键要相同。

 

将一个Map集合的数据封装到一个JavaBean对象中

class User {
​
    private int id;
    private int age;
    private String name;
    private double sal;
。。。。。
。。。。。。。。。


将一个Map集合的数据封装到一个JavaBean对象中

//模拟的注册
public class BeanUtilsDemo {
    
    public static void main(String[] args) throws Exception {
        
        Scanner scanner = new Scanner(System.in);
        
        //创建Map集合
        Map<String,String> map = new HashMap<String, String>();
        
        System.out.println("请输入您的身份证:");
        String id = scanner.next();
        map.put("id", id);
        
        System.out.println("请输入您的姓名:");
        String name = scanner.next();
        map.put("name", name);
        
        System.out.println("请输入您的年龄:");
        String age = scanner.next();
        map.put("age", age);
        
        
        //给对象封装数据 , 数据全部都在Map中。
        User s = new User();
        
        //把map中的数据封装到对象上。
        BeanUtils.populate(s, map);
        
        System.out.println("用户信息是:"+ s);
    }
}

  

(★)将 获取注册页面中的数据封装成业务对象   

其他页面获取对象:User user = MyBeanUtils.getInstance().req2Obj(request, User.class); 

public class MyBeanUtils {
	private MyBeanUtils() {}
	private static MyBeanUtils instance = new MyBeanUtils();
	public static MyBeanUtils getInstance() {
		return instance;
	}
	
	//获取到注册页面中的数据封装成业务对象
	public <T>T req2Obj(HttpServletRequest request, Class<T> clazz ){
		Map<String, String[]> params = request.getParameterMap();
		T uT = null;
		try {
			uT = clazz.newInstance();
			BeanUtils.copyProperties(uT, params);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return uT;
	}
}

  

 6.  EL表达式

  6.1       .  与 [ ] 运算符

    EL 提供    .   和 [ ] 两种运算符来访问数据。${sessionScope.user.sex}等于${sessionScope.user["sex"]}

      .  和 [ ] 也可以同时混合使用。如:${sessionScope.shoppingCart[0].price}   回传结果为shoppingCart中第一项物品的价格。

    差异:

        (1) 当要存取的属性名称中包含一些特殊字符,如    .  或 – 等并非字母或数字的符号,就一定要使用 [ ],如: ${user["My-Name"] }

      (2) [ ] 可以动态取值,但  .  无法做到动态取值。

          ${sessionScope.user[data]} 此时,data 是一个变量,假若data的值为"sex"时,那等于${sessionScope.user.sex};

          假若data 的值为"name"时,它就等于${sessionScope.user.name}。

  6.2   EL 隐含对象(注意:除了PageContext取的是PageContext对象,其他的都是Map对象)

 

  6.3   el表达式获得指定作用域中的属性值(★★★★★)

使用EL表达式获取数据语法:"${标识符}"(没有指定作用域。如:  ${msg}     )
  EL表达式语句在执行时,会调用   pageContext.findAttribute()方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” ,页面显示空白(注意,不是null,而是空字符串)。

 

7. JSTL核心标签

 

STL 核心标签库标签共有13个,功能上分为4类:

  1. 表达式控制标签:out、set、remove、catch

  2. 流程控制标签:if、choose、when、otherwise

  3. 循环标签:forEach、forTokens

  4. URL操作标签:import、url、redirect

由于精力有限,暂只介绍几个常用的,推荐别人的介绍:https://blog.csdn.net/angel_g/article/details/53196235

https://blog.csdn.net/a_helloword/article/details/80193810  这个写的不错,可以看看。

 

 1. 条件 if

语法1

  没有本体内容(body):把表达式的结果赋值给变量,并存储在指定的作用域中.然后在输出

    <c:if test="boolean表达式" var="varName" [scope="{page|request|session|application}"]/>

    ${varName}

 

语法2

  有本体内容,若表达式为true,则显示之间的文本内容.

    <c:if test="boolean表达式" >

 

 2. 多条件 choose

 

3. 循环迭代标签(foreach)

语法1: 迭代集合对象

 

 

语法2: 迭代指定的次数

 

 4. 时间格式化标签

 

 

8. mvc思想(JSP+Servlet+JavaBean

MVC的模型(Model)负责管理程序的业务数据(包含domain,dao,service),视图(View)负责显示界面,控制器(Controller)负责与用户进行交互(接受请求和选择响应视图)

 

以上是关于jsp-servlet篇的主要内容,如果未能解决你的问题,请参考以下文章

jsp-servlet面试题

jsp-servlet响应HTML文档-书籍管理系统

配置 VScode 编辑器 (前端篇)

Python代码阅读(第19篇):合并多个字典

Python代码阅读(第26篇):将列表映射成字典

Python代码阅读(第41篇):矩阵转置