过滤器的执行过程:
// 目标资源执行前执行
chain.doFilter(request, response);
// 目标资源执行后执行
文件上传的前提:
1.表单的method方法必须是post
2.表单的enctype类型必须是:multipart/form-data
3.表单中input的上传输入域为:<input type="file"/>
<form method="post" enctype="multipart/form-data>
name:<input type="text" name="name"/>
file:<input type="file" name="upLoad"/>
<input type="submit" value="up"/>
</form>
form表单的enctype属性,该属性的作用是用来告知服务器,请求正文内容是MIME类型,相当于Content-type
利用第三方组件实施文件上传,apache:commons-fileupload.jar,依赖:commons-io.jar
代码:
// 检查form的enctype是否是multipart类型
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart)
throw new RuntimeException("文件类型不符")
// 解析请求内容,磁盘文件条目工厂
DiskFileItemFactory factory = new DiskFileFactory();// 产生FileItem的工厂
ServletFileUpload sfu = new ServletFileUpload(factory);
// 建立一个数据结构,用于存储FileItem的数据
List<FileItem> items = new ArrayList<FileItem>;
try{
// 对请求进行解析,吧解析的内容放入到items里面
items = sfu.parseRequest(request);
}catch(FileUploadException e){
throw new RuntimeException("failed");
}
// 对items的数据进行遍历取出
for(FileItem item:items){
// 普通字段
if(item.isFormField()){
processFormField(item);
}else{
processUploadField(item);
}
}
上传中考虑的几个问题
1.将文件放到用户访问不到的地方(WEB-INF目录下)
2.重复名字文件被覆盖的问题,把文件名做成唯一,UUID:通用唯一标识码。a.txt--->UUID-a.txt
3.避免一个文件夹中的文件过多
1)按照日期分目录存储
2)按照文件名的hashCode随机生成目录
int hashCode = fileName.hashCode();
int dir1 = hashCode&0xf;
4.文件大小的限制
web文件上传的内容不宜过大,就是要对工厂的容量进行限制
1)限制单个文件的大小
sfu.setFileSizeMax(3*1024*1024);
2)限制整个文件的大小
sfu.setFileMax(5*1024*1024);
try{
items = sfu.parseRequest(request);
}catch(FileUploadBase.FileSizeLimitExceededException e){
response.getWriter().write("must small 3M");
}catch(FileUploadBase.SizeLimitExceededException e){
response.getWriter().write("sum must small 5M");
}
ServketContextListener
ServletContextListener
HttpSessionListener
HttpSessionListener
ServletRequestListener
ServletRequestListener
ServletContextAttributeListener
ServletContextAttributeListener
HttpSessionAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
HttpSessionBindingListener
HttpSessionActivationListener
AJAX引擎:XMLHttpRequest
JSON:js对象标记,js Object Notation
List<String> list = new List<String>;
list.add("a");
list.add("b");
list.add("c");
JSONArray json = JSONArray.fromObject(list);
public class CreateDeng{
// 泛型使用之前必须声明
// <T>就是声明泛型类型,放在返回值的前面
public <T> T v1(){
return null;
}
public <T> void m2(T t){
}
public <T> void m3(class<T> t){
}
}
// 类上声明泛型,实例方法中就可以使用了
public class CreateDeng<T>{
public T m1(){
return null;
}
public void m2(T t){
}
public void m3(class<T> t){
}
// 对于静态方法必须都是先声明后使用
public static <T> void m4(class<T> t){
}
public static <K,V> K m5(V v){}
}
低点:1302.2
高点:1310.1
点差:7.9
7.9×0.382=3.0178---->1310.1-3.01=1307.09
7.9×0.5=3.95---->1310.1-3.95=1306.15
hibernate.cf.xml
<hibernate-configuration>
<session-factory>
<!--JDBC基本链接-->
<properties name="hibernate.connection.driver_class>com.mysql.jdbc.Driver</properties>
<properties name="connection.username">root</properties>
<properties name="connection.password">sorry</properties>
<properties name="connection.url">jdbc:mysql:localhost:3306/day22</properties>
<!--配置数据库方言-->
<properties name="dialect">com.hibernate.dialect.MySQLDialect</properties>
<properties name="hibernate.hbm2ddl.auto">update</properties>
<!--显示sql的语句及格式>
<properties name="hibernate.show_sql">true</properties>
<properties name="hibernate.format_sql">true</properties>
<!--告知映射文件>
<mapping resource="../Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
I not know how to get the money
200dao*4=800kuajin
Student.hbm.xml
<hibernate-mapping>
<class name="Student" table="STUDENTS">
<id name="id" column="ID">
<!--根据数据库的能力管理主健-->
<generate class="native"></generate>
</id>
<properties name="name" column="NAME"></properties>
<properties name="birthday" column="BIRTHDAY"></properties>
</class>
</hibernate-mapping>
制定自己的三年规划:
2018年,存款10W+;2019年,买一套房,付首付;2020年,买一辆自己的爱车奥迪A4L。无论想什么办法都要实现!!!
Dao.java
public Dao<T>{
void add(T t);
void update(T t);
// 根据主健查找对象
T findOne();
// 根据主健删除对象
void delete(Serializable id)
}
CustomerDao.java
public interface CustomerDao extends Dao<Customer>{
List<Customer> findPageCustomer(int startIndex, int size);
}
config.properties文件用来当作配置文件,通常为用于提供系统参数配置,方便用户对系统参数进行调整,通常以键值对的形式存在
maven 软件项目管理工具
xxx.hbm.xml类实体映射文件:
hibernate.cfg.xml 核心配置文件:数据库配置信息
这个其实也没有什么意思,这个算是一种约定
就像我们中国人的名字都是第一个字是姓,后面的是名一样
我们用这样的命名一眼就可以看出来是hibernate的映射配置文件,
当然如果我们其他的xml配置文件也用这样的格式命名也是可以的,但是这样相当于一种约定,一种命名规范一样
uuid通用唯一识别码:在xxx.hbm.xml文件中,用于配置主健
java 中@的使用
1.javadoc 文档关键字
/*
*@author
*@date
*/
自动生成API文档,标注作者,版本,日期,相关参数等
2.java annotation /java 标注
语法:@关键字(值)
用于把关键字和值传递给编译器,更加精确地控制编译器的动作
关键字随着技术、框架、编译器的不同而不同,比如@Override,说明会重写父类的该方法
@Deprecated 表示当前元素是不赞成使用的
@SuppressWarning 表示忽略一些不当的编译器信息
src/main/java:存放java文件
src/main/resource:存放配置文件
src/test/java:存放测试的java文件
src/test/resource:存放测试的资源文件
src/main/webapp:存放jsp,images,js等文件
src/main/webapp:存放jsp,images,js等文件
FCK文本编辑框,js进度条,js文本框,js使用highslideJs
// 使用InputStream输入流读取到path下的文件,将输入流InputStream写到输出流(response对象中获取)中
InputStream in = new InputStream(new File(ServletActionContext.getServletContext.getRealPath(""), path));
OutputStream out = response.getOutputStream();
while(int b=-1;(b=in.read())!=-1){
out.write(b);
}
out.close();
in.close();
//${}:EL表达式表示你从另外一个页面获得的参数值
style="CURSOR:hand"// 当鼠标悬浮在标签上表现为手形
timestamp:时间戳,是一个数据,一个能够表示在某个时间之前已经存在的、完整的、可验证的数据,通常是一个字符序列,
唯一表示某一时刻的时间。
"${pageContext.request.contextPath}/image.jsp?timestamp="+new Date().getTime()
timestamp表示一个参数,一个叫时间戳,浏览器会判断当前请求路径是否发生改变,如果没有改变,它会提取缓存中的数据,
而不是重新去请求。加上时间戳,保证每次请求的路径不一样。
function checkNumberImage(){
// 获取标签
var imageNumber = document.getElementById("imageNumber");
imageNumber.src = "${pageContext.request.contextPath}/image.jsp?timestamp="+new Date().getTime();
}
Random rand = new Random();
String sRand = "";
for(int i=0;i<4;i++){
String rand = String.valueOf(rand.nextInt(10));
sRand += rand;
}
session.setAttribute("CHECK_NUMBER_KEY",sRand);
//ImageIO:用来进行简单的图片IO操作,一个是读(read),另一个是写(write)
1.read:
File file = new File("c:/test/a.jpg");
BufferedImage bi = ImageIO(file);
2.write:
RenderedImage的子类是BufferedImage,传递子类直接实例化父类
public static boolean write(RenderedImage im, String formatName, File output);
public static boolean write(RenderedImage im, String formatName, OutputStream output);
public static boolean write(RenderedImage im, String formatName, BufferedOutputStream output);
// public static boolean isBlank(String str):是否为空(null),长度为0,由空白字符(whitespace)等组成
StringUtils.isBlank(null)=true;
StringUtils.isBlank("")=true;
StringUtils.isBlank(" ")=true;
// public static boolean isEmpty(String str):判断为空,标准是String str=null或者String str.length()==0
StringUtils.isEmpty(null)=true;
StringUtils.isEmpty("")=true;
StringUtils.isEmpty(" ")=false;
equalsIgnoreCase
public boolean equalsIgnoreCase(String anotherString)
将此字符和另一个字符忽略大小写后进行比较,返回布尔值
// 从网页获取数值
request.getParameter(xxx)
// 从session获取数值
request.getSession().getAttribute(xxx);
public class loginUtil{
// remember me
public static void rememberMe(String name, String password, HttpServletRequest request, HttpServletResponse response){
// 建立两个Cookie,存放指定值
Cookie nameCookie = new Cookie("name",name);
Cookie passwordCookie = new Cookie("password", password);
// 设置Cookie的有效路径(当前项目)
nameCookie.setPath(request.getContextPath()+"/");
passwordCookie.setPath(request.getContextPath()+"/");
// 设置cookie的生存时间
// 先获取页面用户选定记住我的复选框的值
String rememberMe = request.getParameter("remember");
// 复选框选定
if(remember!=null && remember.equals("yes")){
// 生存时间为7天
nameCookie.setMaxAge(7*24*60*60);
passwordCookie.setMaxAge(7*24*60*60);
}
// 复选框没有选定
else{
nameCookie.setMaxAge(0);
passwordCookie.setMaxAge(0);
}
// 将Cookie添加到response中
response.addCookie(nameCookie);
response.addCookie(passwordCookie);
}
}
// 在页面中读取cookie数据,嵌套java代码
<%
String name = ""'
String password = "";
String checked = "";
// 获取请求的cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length()>0){
// 遍历数据,获取想要的cookie
for(Cookie cookie:cookies){
if(cookie.getName().equals("name")){
name = cookie.getValue();
checked = "checked"
}
if(cookie.getName().equals("password"){
password = cookie.getValue();
}
}
}
%>
// 要知道,每次访问URL链接的时候,先执行过滤器的doFilter方法
// this永远表示当前对象,在jsp中,this就是指9大内置对象的page,Object page = this
request.setAttribute("name",name)
URLEncoder.encode(name,"utf-8");
URLDecoder.encode(name,"utf-8");
URLDecoder:HTML编码的实用工具类
// 在域对象内,进行存值和取值
在action中将数据放到值栈中,然后在页面中从值栈中取值
每次访问action就创建一次值栈,一个action只有一个值栈
栈结构:root对象栈,context叫做Map栈,放入元素,压栈
值栈分为两个部分,root部分和context部分
ValueStack s = ActionContext.getContext().getValueStack();
s.set("username","fireman");
// 访问控制系统必须要存在session,这样可以记录用户信息,服务器获取用户登录后的session,如果为空,则跳转到登录页面
如果session不为空,直接方形
// 如果在action,service,dao中出现异常,使用catch进行异常捕捉,使用log4j将异常存放到指定的日志文件中,通过return "errorMsg"
跳转到错误页面
// 粗粒度的权限控制,采用过滤器,精确到session的控制权限,判断session是否存在。如果session不存在就跳转到首页,如果存在可以通过URL链接访问对应的操作
// 细粒度的权限控制,采用struts2的拦截器,控制URL,可以访问相关的jsp页面,不可以访问一个jsp页面
webservice:用来在多个独立系统之间,建立一个桥梁
hibernate的二级缓存机制(cache):对应查询结果相同的数据,可以减少频繁操作数据库的操作
sessionFactory:二级缓存:1)类级别缓存;2)集合级别缓存;3)查询级别缓存;4)更新时间戳缓存
SQL的联合查询语句,field理解为字段更为合适
lucene工作原理:
1)索引数据库原理:
向索引库中进行增、删、改的时候:IndexWriter:addDocument(),updateDocument(),deleteDocument()-->创建索引库:一堆二进制文件;
indexSearcher:从索引中检索数据searcher()
Document对象
new Field("id");
new Field("name");
new Field("content");
Article对象
id,name,content
索引库中存放数据的原理
Store:是否将数据存储到索引库的数据区域
Index:是否将数据更新到索引库的目录区域
使用唯一编号来区分数据的唯一性
数据库用来存放数据
索引库用来查询和检索
<properties>
<!--配置扩展-->
<common>IK_Analyzer</common>
<entry key="ext_dic">ext.dic</entry>
<entry key="ext_stopwords>stopword.dic</entry>
</properties>
set和get方法可以提高与变量的安全性和封装性。变量赋值:1)在构造函数内部;2)采用set方法
一般对私有变量进行访问操作,大多数都是使用在包含大多数属性的类实体中
<script language="javascript" src="${pageContext.request.contextPath}/script/xxx.js"></script>
new SimpleDataFormat
Content-Disposition:MIME类型指定代理如何显示附加文件。服务器向浏览器发送文件时,如果用户需要保存,
可以使用该设置进行文件保存,但是必须要附加上:attachment;filename="xxx";
也就是确保浏览器弹出下载对话框
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
JXL是java操作excel的工具类库,从文件中获取excel数据,读取数据后,将数据写入到集合中
用户通过模板导入数据,之后再从模板中读取数据,将数据保存到数据库中,excel导入数据
防止表单重复提交:生成一个token,放到:HttpSession;input隐藏域
表单提交:input=111,之后从HttpSession获取,input隐藏域。
进行对比,一值:保存数据,将HttpSession的数据删除;不一致,重复提交
webapps:web应用所在的目录,供外界访问的web资源的存放目录。在该目录下,有几个文件夹就有几个目录
WEB-INF:用户无法直接访问。classes:存放编译好的字节码文件;lib:存放应用需要的jar包;web.xml配置部署信息
在Tomcat中的lib中的jar包,为所有应用需要的jar包,为所有应用服务
Tomcat中的配置信息:
<Server>:server容器组件,为顶级元素,可以包含一个或者多个<service>元素
<service>:包含一个<engine>,一个或多个<connector>
<connector>:代表实际与用户交互的组件,接受请求,返回相应
<engine>:每个service只有一个engine引擎,处理客户的请求
<host>:一个engine有多个host,具有多个应用
<context>:使用最频繁的元素,代表一个应用
用户的访问都是通过Tomcat的链接过来的,一个引擎中管理多个主机,一个主机有管理多个应用
配置虚拟主机,在网站需要发布的时候,要对Tomcat服务器进行域名和主机配置,重要目录为:Tomcat/conf/server.xml
在<engine>标签中配置:
<Host name="www.deng.com" appBase="e:/appExample"
unpackWARs="true" autoDeploy="true"/>
修改本地hosts文件:C:/Windows/System32/drivers/etc/hosts
name1=value1&name2=value2
只有通过POST提交的方式才能够看到请求正文,正文的内容是要提交的数据
name=username&password=mypassword&sex=male
请求头的作用是向服务器传递一些附加信息
Accept:告诉服务器,浏览器能够接受的MIME类型
在磁盘中,通过文件名的后缀区分文件类型
在网络中,通过MIME来区分数据
MIME特点:大类型/小类型,text/plain
1,2,3,4,5
4:访问的资源不存在
5:服务器内部错误,服务程序出现异常
浏览器收到服务器的相应,数据都是HTML文件,浏览器对HTML文件进行展现
servlet是运行在服务器端的动态资源,能够接受用户请求,发出相应
服务器端的编程都是基于http协议的
建立一个servlet,继承一个javax.servlet.http.HttpServlet抽象类
javax.servlet:通用包
javax.servlet.http:与http协议有关
load-on-startup:一启动就加载
Servlet关联:ServletConfig关联:ServletContext
Servlet依赖:ServletRequest,ServletResponse
GenericServlet实现Servlet
HttpServlet继承GenericServlet
HttpServlet依赖HttpServletRequest和HttpServletResponse
在配置servlet时候可以配置参数
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>com.deng.Demo1</servlet-class>
<init-param>
<param-name>sex</param-name>
<param-value>male</param-value>
</init-param>
</servlet>
//获取
ServletConfig cfg = getServletConfig();
cfg.getInitParameter("sex")
//获取多个值
ServletConfig cfg = getServletConfig();
Enumeration e = cfg.getInitParameterNames();
while(e.hasMoreElements())
{
String value = e.nextElement();
cfg.getInitParameter(value);
}
ServletContext非常重要,每一个应用有一个ServletContext,和应用的生命周期完全一致
实现多个Servlet之间的数据共享,ServletContext里面有一个map结构:key:"P",value:"p1"
Servlet1:ServletContext.setAttribute("P","p1");
Servlet2:ServletContext.getAttribute("P");
...
域表示的是存活范围
向ServletContext存放东西:public void setAttribute(String a, Object obj)
从ServletContext去东西:public Object getAttribute(String a)
从ServletContext删除东西:public void removeAttribute(String a)
获取所有的名称:Enumeration getAttributeNames();