文章目录

  • 一、表单
  • 二、servlet


一、表单

1、过程:控制层创建表单Bean对象,封装表单参数,传给业务层,再传给持久层,对数据库操作,结果Bean封装结果信息,通过request传给业务层,再传给视图层(渲染)
2、数据Bean(POJO):接收表单参数——表单Bean,接收数据库参数——数据Bean,接收结果参数——结果Bean
**POJO:**POJO是一个简单的、普通Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不继承或不实现任何其它Java框架的类或接口。
只能装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力
POJO讲解 作用:封装数据

同内置对象传递数据 Bean
表单Bean:自动收集表单里面的参数
web组件一定要包分明,类名与文件名相同
javaBean 数据Bean 业务逻辑Bean
问题:
1.创建对象是否要调用构造方法?
原则上一般情况,创建对象只调用一个构造方法;但是用克隆或反射,不需要创建
用this进行构造方法的使用 重载,可能会创造多个构造方法。
2.调用构造方法是否一定会创建对象?
创建子类对象一定会调用父类构造方法,但是没有创建父类对象,所以调用构造方法不一定会创建对象

1、Page
静态编码 动态编码 request.setCurr
jsp标签:if (page.getAttrebute(cb)) new CountBean
CountBean实际上是在虚内存的堆中创建的,由page内置对象管理,在page内置对象取出属性名为cb
该页面的page对象有没有属性为cb的对象,如果没有就创建
结论:从一个页面跳转到另一个页面不能用page

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="page" class="cn.mldn.lxh.CountBean"/>
访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!
<jsp:forward page="pageJBDemo02.jsp"/>

2、session
生命周期:用户
可以传递数据,但是有缺点?
缺点:可以将对象从一个页面传递到另一个页面,但是生成周期过长,所以不使用session
session传递验证信息

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="session" class="cn.mldn.lxh.CountBean"/>
访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!
<a href="sessionJBDemo02.jsp">sessionJBDemo02.jsp</a>

3、application
创建了对象 page request session,在session中找到了,所以为3
tomcat启动就创建,而且只创建一个
缺点:不安全;生命周期很长,占用内存

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="application" class="cn.mldn.lxh.CountBean"/>
访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!

传数据,使用request,前提:服务端跳转
客户端跳转:通常用在出错的页面,正常情况下使用服务端跳转

二、servlet

1.概念: 由java编写的、线程安全的web组件,在mvc设计模式中起到控制层作用(control)(M->JavaBean)
线程安全:servlet属性不能被线程所修改,不能改变属性,只能构造方法或init初始化,只有get,没有set
java中线程安全:String Integer Exception
web组件:servlet不是自己调用,是tomcat调用

2.作用
1)CGI(通用网关接口):能够从tomcat服务器中获取数据的能力(servlet拿到的是内置对象),servlet以注入的方式获取内置对象(tomcat主动把内置对象给servlet)
解析:内置对象由tomcat创建,作用是封装各种信息,放在tomcat服务器,由tomcat管理
servlet与tomcat交互,拿到信息,即能够从tomcat服务器中获取数据(请求信息、验证信息等),即具有“通用网关接口”作用
问题:注入、依赖查找的区别?(举例)
注入:A要B买东西,A主动给B钱,B立即买好给A => 效率高
依赖查找:A要B买东西,A没给B,B等待或者询问A,最后才去买 => 效率低
(2)创建表单Bean,封装表单数据
表单Bean与结果Bean(持久层创建)是相对的
(3)分析请求,根据分析的结果把请求分发到相应的业务层组件
(4)根据业务层转向信息,转到相应的视图组件

3.流程
1.启动tomcat,配置tomcat,创建servlet
2.用户在浏览器发送请求(请求字符串+请求参数:服务器IP地址,8080,项目目录,参数)
3.tomcat创建request内置对象,接收请求参数和请求字符串,封装请求参数到表单Bean,将请求交给servlet
4.tomcat调用doPost()(因为是表单),将封装请求参数的request response注入doPost()
5.servlet分析请求,通过分析结果将请求交给业务Bean,注入表单Bean、request、response对象(传入三个参数)
6.业务层将请求交给持久层,包括表单Bean,持久层 request.getName()拿到参数,与数据库进行交互,持久层创建结果Bean对象,封装数据库的结果Bean信息,返回给业务层,业务层将结果Bean设到request,业务层向控制层返回一个转向信息,控制层根据转向信息,将信息转向视图层,拿到结果信息进行渲染处理,视图层通过response返回给浏览器显示

4.语法
(1)包声明 servlet字节码文件放到 WEBINFO/classes文件 package cn.zte.pxb.servlet;
(2)包导入 javax.io.* / javax.servlet.* / javax.servlet.http.*
(3)定义servlet类:public class SimpleServlet extends HttpServlet ( javax.servlet.*)
(4)覆写两个方法:doGet() 注入request response对象,形参变量接收request response地址,HttpServletRequest、HttpServletResponse接口类型接收参数,在javax.servlet.http.*包下
doPost() 与doGet类似
为什么注入request response对象地址?
tomcat创建了out对象,out内置对象可以直接往http协议中放静态代码,直接给浏览器发送信息(测试使用),response不行,但是建议使用response,方便管理维护

5.部署
问题:将SimpleServlet.java文件复制到WEBINFO/classes中,在doc下输入运行:javac -d . SimpleServlet.java ==> 报错
原因:javax包不再jdk下,在tomcat/common/lib/servlet-api.jar下
方法两种(1)(推荐)J2EE的jar包放在jdk下,C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext servlet-api.jar,再编译,没问题
(2)设置环境变量,指定servlet-api.jar位置

6.配置
WEBINFO/web.xml
重启tomcat,一启动就读取web.xml文件到内存
load-on-startup :一启动创建servlet 找到servlet字节码文件,加载到方法区,创建出servlet (创建servlet越早越好)

<servlet>
	<servlet-name>simple</servlet-name>
	<servlet-class>cn.zte.pxb.servlet.SimpleServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
	<servlet-name>simple</servlet-name>
	<url-pattern>/demo</url-pattern>
  </servlet-mapping>

init(ServletConfig config) servlet创建,自动调用init方法,封装重要信息config注入
destory() 销毁,释放servlet占用的资源,一般servlet不要轻易销毁
servlet生命周期:与tomcat生命周期一样
真正项目中只有一个servlet,,因为线程安全
判断servlet知否被创建,通过init方法,在方法内设置一些信息
init有参、无参情况

package cn.zte.pxb.servlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class LifeCycleServlet extends HttpServlet
{
	// 初始化
	public void init(ServletConfig config) throws ServletException
	{
		System.out.println("** Servlet 初始化 ...") ;
	}
	// 表示处理get请求
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		System.out.println("** Servlet doGet处理 ...") ;
	}
	// 处理post请求
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{   this.doGet(req,resp);
		//System.out.println("** Servlet doPost处理 ...") ;
	}
	// 销毁
	public void destroy()
	{
		System.out.println("** Servlet 销毁 ...") ;
	}
}

7.servlet生命周期
tomcat一启动,从servlet创建(配置load-on-start(推荐) / 第一次访问时创建),执行init方法(有参 / 无参),封装servlet配置信息的config注入到init对象(有参),servlet在服务器中一直存在,等待用户发请求,【用户通过地址栏或超链接发送get请求,交给tomcat,找到servlet的doGet方法,】/【用户通过表单发送post请求,找到servlet的doPost方法】,tomcat注入request response对象,拿到request请求参数(封装到表单Bean)和请求字符串(分析,传给业务层),将请求交给持久层,与数据库据交互,拿到信息封装到结果Bean,回给业务层,业务层将结果Bean设到request对象,业务层向控制层返回一个转向信息,控制层根据转向信息转向视图层,拿到结果Bean进行渲染处理,视图层通过response返回给浏览器显示,servlet处理完后不会消失,一直等待用户发请求,tomcat关闭,servlet调用destroy方法,释放资源,销毁,但还是占据内存,使用GC垃圾清理,Unload完全移出内存。
共四个方法:init() doGet() doPost() destroy()

8.ServletConfig
ServletConfig是接口
实例全局变量,在servlet的堆中创建
private String username;private String password;
doGet拿到 (username=this.username password=this.password)

数据库连接信息放入配置文件中:(执行流程)
1.tomcat启动,配置好的web.xml
2.创建config,将初始化参数封装到config
3.创建servlet对象,执行init(),把封装servlet配置信息的config注入
4.获取配置信息,拿到初始化参数config.getInitParam() config.getInitValue()
5.传递初始化参数到实例全局变量
6.用户发请求,访问doGet方法,注入request response,获得从实例全局变量的初始化参数
7.分析请求 => 持久层 => 业务层 => 控制层 => 视图层

servlet线程安全组件,组件不能被其他线程所修改
1.private String username;private String password;没有set方法,其他线程无法修改属性
2.doGet只是获得username password的值,不能修改
3.如果真的要修改username password,在init方法内修改,而线程并不调用init方法,只调用doGet doPost

通过表单访问servlet
访问servlet:组件所在路径+表单所对应servlet映射名
resp.sendRedirect(“demo.jsp”);
demo.jsp路径:访问servlet映射名的路径是demo.jsp相对路径的默认路径
A路径下通过表单访问servlet /A/formServlet demo.jsp: /A
B路径下通过表单访问servlet /B/formServlet

session:依赖查找
username password设到session
application:
通过:req.getSession().getServletContext() 拿取application(推荐)
验证是否拿到application:setAttribute()
resp.sendRedirect(“demo.jsp”) 客户端跳转
req.getRequsetDispatcher(“demo.jsp”) 服务端跳转

init():直接从doPost中拿取 this.getServletContext()
拿application方法依赖与init,耦合性高,不推荐使用

总结servlet:CGI 拿取内置对象 有两种方式:
注入:request response config(init)
依赖:session application