MVC
- Model View Controller,模型(model)-视图(view)-控制器(controller)
- 用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑
- 模型层: 负责模块数据的处理,实际开发时又分为两层(业务和持久),实体类javabean也在模型层
- 业务层service,对具体方法进行编写
- 持久层DAO(data access object),连接数据库完成数据的序列化
- 视图层: 负责客户端数据的展示和收集,html+css+js+jsp等
- 控制层: 负责接收客户端发送的请求,根据请求通过servlet或controller调用指定业务
DAO持久层
- data access object数据访问对象是一个面向对象的数据库接口
- service业务:处理用户请求时,调用具体的DAO方法,执行数据库CRUD方法,并返回结果
- PO - persistence Object - 实体对象 - 装载一行数据
实体对象:用于装载数据库表的一行数据 - VO - value object
值对象:装载直接写入的数据
- JavaBean: java中用于封装数据的类,在java中有的专门名称JavaBean;
- java中javabean有基本规范
- 当前类的名称和所描述的实体名称建议一致,声明为Public
- 提供公共无参构造方法
- 属性私有化,避免被外界修改,属性要提供getter/setter方法
- 属性名称必须遵守camel命名法
- jdk提供的反射
- 根据字节码(对应java中对象在内存的映像)或对象引用,在运行时对对象进行动态解析的技术
- 从字节码对象开始反射的解析
- 字节码类型:Class
- 得到字节码步骤:
- 类名.class:
Class dc=Dept.class;
- 类的全路径:
Class.forName("类的全路径")
- 根据对象得到字节码:
obj.getClass();
- 根据字节码得到对象上的信息
JDBC
- Java DataBase Connectivity, java数据库连接
- 用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成
- 加载JDBC过程:
- 加载数据库jdbc驱动到内存
- 完成应用程序与数据库的连接(桥梁)
- 在桥梁上生成一个处理数据的对象(车)
java-车(sql语句)-数据库(执行sql语句)-车(sql语句结果)-java
- 返回类型:
- DML语句 - 增删改 - 影响数据库表记录的行数(返回数字)
- DQL语句 - 查询 - 返回结果集(虚拟表)
- 加载mysql驱动方法
- Class.forName(driver);alt+/自动导包
- 项目下按包查找maven-mysql-jdbc-driver复制包路径
- data source explorer里查看属性找到class driver复制包路径
- 布置mysql环境
- maven中pom.xml中加载mysql
- window下显示data source explorer窗口找到database connections
- 新建查找到mysql,通过.m2文件夹内的mysql.jar导入
- 连接虚拟机中安装的数据库,端口号3306,选择要导入的数据库
- 输入数据库用户名密码保存
- java属性文件的特点
- 扩展名.properties
- 内容以键=值,回车换行,注释以#开头
- 中文要以UNICODE码存储,否则不能读取
- 通过文件名获取文件物理路径
InputStream is = this.getClass().getClassLoader().getResourceAsStream(“db.properties”);
Properties p=new Properties();
p.load(is); - 属性文件的意义
- 将属性文件和可执行java.class文件放在最终的文件夹中
- 目的在于在java程序的时候,也可以修改代码中的参数,如新IP地址等
servlet
- Server Applet,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容
- 广义的Servlet是指任何实现了这个Servlet接口的类
- javaEE体系
- 基础(javaSE)
- web模块(jsp/servlet)
- 数据库才做(jdbc)
- 远程通讯(RMI远程方法的调用实现RPC协议)
RPC远程过程调用协议,通过网络从远程计算机上请求调用某种服务 - JMS(java消息服务),java平台中关于面向消息的中间件
- WebService(网络服务),是一个平台独立的,低耦合的,自包含的,基于可编程的web的应用程序,可使用开放的xml标准来描述,发布,查询,协调和配置这些应用程序,广泛用于分布式互操作的应用程序开发,如天气服务whteatherwebservice
- JNDI(java命名目录接口),同名部署并发布资源名称,java项目可以通过JNDI提供的API接口访问外部资源
- EJB(Enterprise JavaBeans),javaEE服务器端组件模型,耦合度过高
- Java Transaction API,处理分布式事务
- Java TransactionService,组件事务监视器
- web模块
- 基于B/S结构工作模式,前端使用浏览器Browser,后端使用支持HTTP协议的服务器Service,工作方式基于请求request和响应response
- web服务器提供了能够在不同范围存储数据的能力,对于javaweb服务器要求必须安装JVM
- web服务器(Tomcat免费,端口8080),特点:
- 以JVM为基础
- 支持HTTP
- 支持多线程
- 能够存储http传来的数据
- java中web服务器又称为jsp/servlet的容器,否则后者无法运行
- jsp:负责显示
- servlet:负责控制
- service:负责业务
- jdbc:负责调用数据库
创建一个servlet
- 创建servlet类,继承 HttpServlet父类 ,重写doGet,doPost或service方法
HttpServlet支持http协议,对于多客户端的请求,在容器执行时自动进行多线程的创建
- doGet方法用于处理Get请求
- doPost方法用于处理Post请求
- service方法用于处理两种请求(不常用,无法区分请求方式)
- 修改描述文件web.xml,添加servlet映射,servlet2.5以上版本支持注解方式配置
- 启动服务器后,通过浏览器地址调用servlet的url映射
- 当浏览器通过get/post方式传来一个http的请求时,tomcat会找项目部署,无则返回404错误
- 扫描对应url项目时,先扫描web.xml文件,找寻servlet并执行
servlet配置
- servlet基础信息部分
<servlet></servlet>
servlet-name,描述唯一标识
servlet-class,添加自定义servlet类的全路径(带包名的路径)
<servlet-mapping></servlet-mapping>
- servlet对应url映射部分
servlet-name,对应基础部分的名称
url-pattern,对应客户端请求的url映射,必须以/开头,名称任意
http://localhost:8888/映射名称 跳转到servlet的映射的类
- 配置servlet启动顺序
<load-on-startup>整数</load-on-startup>
//按整数从小到大启动 - 配置给servlet传递的初始化配置信息
<init-param>...</init-param>
//…中包括:
<param-name></param-name>
//参数名
<param-value></param-value>
//对应值(字符串) - 流程:首先扫描基础部分的名称和类存入内存,再扫描url映射部分找到映射名称,找到内存中对应名称下的类实例化后执行
servlet生命周期
- 创建实例 :当servlet首次被调用时,在web容器JVM栈中创建servlet对象,仅执行一次
- 初始化 :调用servlet固有方法init(ServletConfig)实现初始化,首次访问servlet,使该对象与web容器配置进行交互,仅执行一次
- 服务 :调用servlet中service()方法,对应客户端的每次请求,根据用户请求类型将请求流分发给get或post,每次都执行
- 销毁 :调用servlet中destroy()方法,web容器正常终止时调用,用于处理多余的垃圾文件
- servlet功能
- 多重映射
- servlet在web配置中,可以配置成多路径或模糊查询的路径形式
- 多重映射指配置多个url-pattern都可以访问同一个目标,可以通过类上@或在web.xml中添加相同servlet-name下多个不同url-pattern
- web容器
- 当客户端向web容器发送请求时,web容器请求信息经过对HTTP协议解析后,参数信息会形成键值对(仅传递字符)存储在本地缓冲,该缓冲会形成request区域的缓冲池,该缓冲池会调用对应url映射的servlet或jsp时,将request区域中的键值对传递给HttpServletRequest对象
- 返回客户端浏览器的内容,web容器对应HttpServletResponse对象进行输出的接口,通过该接口形成输出流,通过向该流写入内容,在客户端浏览器中下载该流生成的指定形式的代码
Servlet在MVC中的作用
- 处理客户端请求的数据
- 调用业务bean中的方法
- 保存模型数据,来自于客户端或业务bean产生的数据
- 跳转
Servlet处理客户端请求的数据
- 重写父类HttpServlet中doget,dopost方法,通过方法中第一个参数request对象从web容器中接收客户端请求数据
- 解决中文乱码:
eclipse中修改显示的字符集为UTF-8方法:
- window->preferences->general->content types->java source file->default encoding:UTF-8
- window->preferences->general->workspace->text file encoding:other:UTF-8
- 由于http协议内部字符集使用ISO-8859-1(西欧标准字符集),在web中转换的方法有三种:
- 针对post类型请求的数据:
- 将request对象,调用setCharacterEncoding(“要转换的字符集”)方法,必须与客户端编码保持一致
request.setCharacterEncoding(“UTF-8”); - 中文字符集:GBK,GB2312,UTF-8,BIG5
- 适合get和post请求的数据
- 得到用户传递的参数返回字节数组
byte[] by=xname.getBytes(“ISO-8859-1”); - 将字节数组按指定的字符集,重新组合成字符串
String str=new String(by,”UTF-8”);
- 针对get类型请求的数据
- 修改server.html文件,可实现doget方法内不转码也是UTF-8字符集
get和post的区别
- Get 是用来从服务器上获得数据,而Post 是用来向服务器上传递数据;
- Get 将表单中数据按照variable=value 的形式,添加到action 所指向的 URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post 是将 表单中的数据放在form 的数据体中,按照变量和值相对应的方式,传递到action 所指向URL;
- Get 是不安全的,因为在传输过程,数据被放在请求的URL 中;Post 的 所有操作对用户来说都是不可见的;
- Get 传输的数据量小,这主要是因为受URL 长度限制;而Post 可以传输大量的数据,所以在上传文件只能使用Post;
- Get 限制Form 表单的数据集必须为ASCII 字符,而Post 支持整个ISO10646字符集;
- Get 是Form 的默认方法
Servlet在MVC中保存模型数据
- http协议本身为无状态协议,web容器提供了不同范围存储区,能弥补http无法保存数据的缺点
- web容器包括request缓冲区,普通的堆栈,存储区
- 发来的请求首先进入request缓冲区:
- 需要处理的数据通过request.getParameter(“组件name名”)处理数据
- 需要存储的数据存储到存储区中
存储区
- 存储区特点:
- 存储区之间是隔离的
- 存储范围不同
- 与系统并用物理内存
- 存储区分三块存储范围,32位系默认分配4G/块
- request (针对一次请求,转发后关闭)
存储周期小,转发后则清空
用于数据展示 - session (一次会话,会话结束后关闭)
安全,存储周期长,数据量过大
用于登录信息等数据保存 - application (一次应用,服务器关闭后关闭)
服务器不关闭则一直存在,不安全,如网络聊天室,多客户端可以用同一个服务器交互,每个客户端都可见服务器接收的数据
- 存储范围的用法:
- 存储数据:
存储范围对象.setAttribute(“标识键”,object); - 获取数据:
object val=存储范围对象.getAttribute(“标识键”,object);
Servlet在MVC中的跳转
- 重定向:
- 向request存储范围中存储数据语法:request.setAttribute(“存储页面”, object);
- 重定向语法:response.sendRedirect(“跳转的页面”);
- 跳转的页面接收缓冲区数据语法:request.getAttribute(“存储页面”);
- 客户端
- 慢
- 两次请求
- 地址栏改变
- 不同服务器下
- 可以访问站外资源
- 不可用request传值
- 转发:
- 存储和接收数据语法同重定向
- 转发语法:request.getRequestDispatcher(“跳转的页面”).forward(request, response);
- 服务器
- 快
- 同一次请求
- 地址栏不变
- 同一台服务器下
- 只能访问站内资源
- 可用request传值
Tomcat
- 一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选
- 在linux环境下配置tomcat
- 安装jdk,配置JAVA_HOME,PATH
修改/etc/profile
JAVA_HOME=,CLASSPATH=,PATH=,export JAVA_HOME PATH
JAVA_HOME=/usr/java/jdk1.8.0_144
JRE_HOME=/usr/java/jdk1.8.0_144/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME JRE_HOME CLASSPATH PATH
PATH=/usr/local/mysql/bin:$PATH
PATH=/usr/local/apache-tomcat-7.0.82/bin:$PATH
export PATH
- 解压tomcat并安装
- yum install -y zip unzip //安装压缩和解压软件,unzip解压命令
- mv apache-tomcat-7.0.82/ /usr/local/
- 项目部署目录/webapps,日志文件目录/logs
- 修改/bin下所有.sh文件为可执行权限chmod a+x ./*.sh
- 添加/bin到PATH
- source /etc/profile 刷新PATH
- 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service - 启动tomcat服务并测试
- startup.sh 启动服务
- netstat -ano|grep 8080 查看端口
- http://10.25.50.156:8080/ 登录已启动的tomcat服务器
- 编辑xml文件
/usr/local/apache-tomcat-7.0.82/conf/tomcat-users.xml
- eclipse配置tomcat远程部署
- 编辑远程tomcat服务器下的conf/tomcat-users.xml末尾添加:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui"/>
<user username="both" password="123456" roles="manager-gui,manager-script"/>
<user username="ping" password="123456" roles="manager-script"/>
- 在tomcat服务器的./conf/Catalina/localhost/目录下创建一个manager.xml文件,写入:
<?xml version="1.0" encoding="UTF-8"?>
<Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
- 在maven中添加tomcat插件
- 在pom.xml中添加中添加插件
maven-resources-plugin 资源文件拷贝插件
maven-compiler-plugin java编译插件
tomcat7-maven-plugin tomcat插件
<path>/${project.artifactId}</path>
表示主页改为追加/当前项目名;如果只写/则表示输入http://localhost:8888/ 就是主页 - 载入插件并启动服务器
run as -maven build…在 中写入命令tomcat7:run