12.19基本概念

1.泛型:参数化类型,List<String> list= new ArrayList<String>();// 里面放的都是相同的基本类型,存储方便,不会造成数据类型的混乱
2.向上转型:子类转为父类,A a = new B();// 父类的引用指向子类对象,有人说这不是多此一举吗,直接可以B b = new B();// 是的,可以这样,但是这样丧失了降低了面向对象编程的特色,降低了可扩展性。
向上转型遗失了同父类不同的方法,即对父类相同的方法,子类进行了该方法的重写。

3.内省机制:内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。
通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),
这些 API 存放于包 java.beans 中。
使用内省机制将表单中的数据映射到类的属性上
Web 开发框架 Struts 中的 FormBean 就是通过内省机制来将表单中的数据映射到类的属性上,因此要求 FormBean 的每个属性要有 getter/setter 方法。但也并不总是这样,什么意思呢?
就是说对一个 Bean 类来讲,我可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile 的属性。

4.反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

PageEncoding是jsp文件本身的编码
contentType的charset是服务器发送给浏览器的内容编码
Service没有做处理,主要是Dao对数据进行了处理,在Service中创建一个Dao对象,生成对象的get和set方法。
在重载函数中,写Dao对象的具体方法(主要实现了什么功能),在将JavaBean对象作为参数放进去

使用Action将表单提交的数据存储到数据库中的流程及内容:
主要的的逻辑:前台的jsp的Form调用Action的具体方法,Action中通过定义和页面具有相同元素的私有变量(生成get和set方法可以拿到前台变量),然后调用dao存储到数据库中
1.struts.xml:采用通配符配置action
2.前台页面addTest.jsp:定义表单变量,name=a,name=b,name=c
3.TestAction动作类的编写:构造私有变量:a,b,c,list(List<TestProtal>),私有service对象。此时,在具体的动作方法中编写动作逻辑,由于我是想要把JavaBean中的数据存起来,
首要要建议一个JavaBean对象,通过这个JavaBean对象获取属性值,之后将这个对象作为参数传递到service的具体方法中(service.add(b))
4.bean TestProtal和数据表相对应:JavaBean实现Serializable接口,属性私有a,b,c,生成get和set方法.此时就要建立数据库中的字段
5.service和dao:主要是dao,service没有做实质性处理,可以认为是action和dao的功能链接
1)TestDaoImpl:数据库查询操作
2)service:没做处理,因为它是中间件,那么将action封装的数据传递给dao的中间过程,在service中建立的是dao的对象,将JavaBean给dao

Maven:专家内行
war:web application archive 叫做web应用程序存档,将应用程序打包,发布到服务器的最好方式
<form action="/day_01/AServlet">:在客户端的/相当于主机:http://127.0.0.1:8080/
<url-partten>/AServlet:在服务器端相当于项目:http://127.0.0.1:8080/day_01/

请求转发,响应重定向
转发是服务器根据请求转发到别的服务,是requset对象,一次请求,一次响应,地址栏不发生变化
requset.getRequestDispatcher("/AServlet").forword(request,response) ===>http://127.0.0.1:8080/day_01/AServlet
重定向,是服务器发起的重定向,用的response对象,两次请求,两次响应,地址栏发生变化
response.sendRedirector("/AServlet")

ervlet请求转发与重定向的区别:
request.setAttribute("test","hello");
request.getRequestDispacther("/test.jsp").forword(request,response);
response.sendRedirect("test.jsp");

一、显示结果:
1、当用request.getRequestDispacther("/test.jsp").forword(request,response); 请求转发后,结果页面输出:hello

2、当用response.sendRedirect("test.jsp");重定向后,结果页面输出:null


二、底层分析:

1、请求转发(RequestDispatcher)的过程:


客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

2、重定向(sendRedirect)的工作原理:


客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。


三、表面分析:

1、当用RequestDispatcher请求转发后,地址栏为http://localhost:8080/test/TestServlet
这真好应正了上面的分析,我们起初请求的就一个servlet,至于你服务器端怎么转,流程怎么样的,我客户端根本就不知道,我发了请求后我就等

着响应,那你服务器那边愿意怎么转就怎么转,我客户端不关心也没法知道,所以当服务器端转发到jsp后,它把结果返回给客户端,客户端根本就

不知道你这个结果是我真正访问的servlet产生的,还是由servlet转发后下一个组件产生的。

2、当用sendRedirect重定向后,地址栏为http://localhost:8080/test/test.jsp
因为这个时候,客户端已经知道了他第二次请求的是test.jsp,服务器已经告诉客户端要去访问test.jsp了,所以地址栏里会显示想要访问的结果。