首页 文章 精选 留言 我的

精选列表

搜索[个人博客],共10000篇文章
优秀的个人博客,低调大师

配置MongoDB(个人公司公共模块,备忘一下)

引入jar包 <dependency> <groupId>com.ehaier.shoppingmall</groupId> <artifactId>shoppingmall-core</artifactId> <version>3.0.10</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.apache.xmlrpc</groupId> <artifactId>xmlrpc-client</artifactId> <version>3.1.3</version> </dependency> 配置yml mongo: replica-set: 10.1.132.28:27017 prop: python: addr: http://10.1.132.22:30001/RPC2 image: source: domain: img.rrscdn.dev/ service.xml引入 <import resource="classpath:mongo-config.xml"></import>

优秀的个人博客,低调大师

Java个人技术知识点总结(优化篇)

代码优化 代码结构层次的优化(目的:更加方便代码的维护--可维护性,可读性) 1.代码注释(代码规范) 2.工具类的封装(方便代码的维护,使代码结构更加清晰不臃肿,保证团队里代码质量一致性) 3.公共部分的提取 代码性能的优化(目的:使程序的性能最优化) 1.使用一些性能比较高的类(bufferInputStream) 2.缓冲区块的大小(4k或者8k) 3.公共部分的提取 4.通常要用stringbuffer替代string加号拼接 业务优化 我们做项目的时候业务优化这方面最主要是从用户体验度角度进行考虑,减少用户操作的步骤提高工作效率,通常有以下几种: 1.可以通过tabindex属性来改变tab键盘的操作顺序 2.可以通过回车键来进行搜索或者提交操作 3.对于单选按钮和复选按钮可以通过操作后面的文本来选择前面的单选按钮以及复选按钮 4.添加的信息要按照id倒序进行排列 5.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而且防止用户多次点击提交操作) 6.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认。 7.根据returnURL在用户登录成功后直接跳到想要访问的资源。 8.进行删除操作时通过confirm提示用户是否确认删除操作,操作完后提示操作是否成功。 9.减少用户操作的步骤 10.使用autocomplete插件快速进行搜索 必背,必做: 1.可以通过回车键来进行搜索或者提交操作 2.添加的信息要按照id倒序进行排列 3.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而且防止用户多次点击提交操作) 4.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认,如果删除成功则弹出提示框告诉用户。 5.减少用户操作的步骤 6.通过ztree,以及kindeiditor来提高用户的体验度 sql优化 1、SELECT子句中避免使用 *, 尽量应该根据业务需求按字段进行查询 2、尽量多使用COMMIT如对大数据量的分段批量提交释放了资源,减轻了服务器压力 3、在写sql语句的话,尽量保持每次查询的sql语句字段用大写,因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行 4、用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据,所执行效率要快于UNION,并且UNION可以自动排序,而UNION-ALL不会 5、避免在索引列上使用计算和函数,这样索引就不能使用 Sql优化精简版: 1.(重点)(必须说) SELECT语句中避免使用 *,尽量应该根据业务需求按字段进行查询 举例:如果表中有个字段用的是clob或者是blob这种大数据字段的话,他们的查询应该根据业务需要来进行指定字段的查询,切记勿直接用* 2.(重点) 删除重复记录(oracle): 最高效的删除重复记录方法(因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); 3.用>=替换> 如一个表有100万记录,一个数值型字段A, A=0时,有30万条; A=1时,有30万条; A=2时,有39万条; A=3时,有1万记录。 那么执行A>2与 A>=3 的效果就有很大的区别了,因为 A>2 时,ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。 4.(重点)尽量多使用COMMIT如对大数据量的分段批量提交 5. (重点)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符此操作是强列推荐不使用的,因为它不能应用表的索引。推荐方案:用NOT EXISTS或(外连接+判断为空)方案代替 6.(重点 必须说)LIKE操作符(大数据的全文检索使用luncene)(solr)因为使用like不当,会导致性能问题,原因是like在左右两边都有%的时候,不会使用索引。 如LIKE '%5400%'这种查询不会引用索引,而LIKE 'X5400%'则会引用范围索引。 一个实际例子: 查询营业编号YY_BH LIKE '%5400%'这个条件会产生全表扫描,如果改成YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。 7.(重点,必须说)避免在索引列上使用计算和函数,这样索引就不能使用 举例: 低效: SELECT… FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT… FROM DEPT WHERE SAL > 25000/12; 8.(重点 必须说)用UNION-ALL 替换UNION, 因为UNION-ALL不会过滤重复数据而且不会自动排序,所执行效率要快于UNION。 9.(优化,重点,3个方面 a.缓存 b.分段批量 c.存储过程)减少访问数据库的次数 举例:如果批量删除多条数据,可以用 delete from tableName where id in (1,2,3) 而不要用多条delete语句进行删除 10.(重点 必须说)用TRUNCATE替代DELETE TRUNCATE不记录日志,DELETE记录日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE进行删除就不能进行恢复,TRUNCATE是删除整张表的数据不能加where条件。 ================================================================== mysql,sqlserver中如果 id为自增类型,那么如果用TRUNCATE删除,则id字段再插入数据时从1开始,如果delete删除的话,则从删除之前的id的值继续增长。 防sql注入 针对防sql注入,我们通常是这样做的: 首先在前台页面对用户输入信息进行js验证,对一些特殊字符进行屏蔽,比如:or ,单引号,--,= ,还有就是限制用户名输入的长度,我们一般将其限制在6---13位。另外,对于用户的敏感信息我们进行Md5加密,还有,为了增加用户体验度和用户友好度,为了不使用户看到一些详细的异常信息我们会进行错误信息页面的定制,像404,500错误。另一个我层面讲,这样做也是为了保护我们的一些重要信息。此外,我们会给特定的人分配定定的权限,而不是给其分配管理员权限! sql注入 所谓SQL注入,就是通过一些含有特殊字符的sql语句发送到服务器欺骗服务器并进行攻击。(特殊字符:or, 单引号,--,空格) Sql注入的防护 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式(js正则或者java后台正则),或限制长度;对单引号和双"-"进行转换等。 2.永远不要使用动态拼装sql,使用参数化的sql。(永远不要使用+号拼接sql字符串,而是使用?传参的方式进行) 3.不要给用户太高的权限而根据需求进行赋权 4.对敏感信息进行加密如md5(单向加密不可逆转)。 5.自定义错误页面。目的是为了不把我们的程序的bug暴露在别有用心的人的面前。而去不会让用户看到报错的页面,也提高了用户的体验度。 SQL注入防范 使用参数化的过滤性语句 要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。 输入验证 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端(java代码)都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。 在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如Regular Expression Validator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过Custom Validator自己创建一个。 错误消息处理 防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。 加密处理 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。 存储过程来执行所有的查询 SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。 使用专业的漏洞扫描工具 攻击者们目前正在自动搜索攻击目标并实施攻击,其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。 确保数据库安全 锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限,撤销不必要的公共许可,使用强大的加密技术来保护敏感数据并维护审查跟踪。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限,那么就禁止它对此表的 drop 、insert、update、delete 的权限,并确保数据库打了最新补丁。 安全审评 在部署应用系统前,始终要做安全审评。建立一个正式的安全过程,并且每次做更新时,要对所有的编码做审评。开发队伍在正式上线前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关,“就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。 数据库中常用术语: ddl:数据定义语言 Create Drop Alter dml:数据操纵语言 insert update delete select dcl:数据控制语言 grant revoke tcl:事务控制语言 commit rollback

优秀的个人博客,低调大师

Java个人技术知识点总结(框架篇)

框架篇 Struts1的运行原理 在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionServlet接收,ActionServlet在用户请求时将请求参数放到对应的ActionForm对象中的成员变量中,然后ActionServlet则会根据struts-config.xml中的映射关系找到相应的Action中的方法,将对应的ActionForm一并传给这个Action中的方法里,然后执行相应的业务逻辑操作,最后就根据ActionMapping的findforward方法返回一个ActionForward,之后在struts-config.xml中找到与之对应的forward标签,根据它的配置路径找到对应的jsp页面。 Struts2的运行原理 1、tomcat 启动的时候会加载 web.xml 、核心控制器 FilterDispatcher 会加载并解析 struts.xml 2、客户端会发送一个请求到 action 、FilterDispatcher 会根据后缀名进行拦截 3、FilterDispatcher根据 struts.xml 的配置文件信息 找到 某个action 对应的某个类里的指定方法 4、执行相关的业务逻辑最后返回 一个String 5、<action/> 里配置 <result/> name的属性值与返回的String 进行匹配,跳转到指定的jsp 页面 struts2的体系结构 1、客户端向Servlet容器(例如Tomcat)发送一个请求; 2、这个请求经过一系列的过滤器(Filter); 3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action; 4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy; 5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类; 6、ActionProxy创建一个ActionInvocation的实例。 7、ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是jsp或者FreeMarker的模版。(体系结构图见下一页) Spring MVC运行原理 整个处理过程从一个HTTP请求开始: 1.Tomcat在启动时加载解析web.xml,找到spring mvc的前端总控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置文件信息。 2.DispatcherServlet接收到客户端请求,找到对应HandlerMapping,根据映射规则,找到对应的处理器(Handler)。 3.调用相应处理器中的处理方法,处理该请求后,会返回一个ModelAndView。 4.DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将要显示的数据传给对应的视图,最后显示给用户。 Struts1.x与Struts2.x的区别 Struts 2以WebWork为核心, 采用拦截器的机制来处理用户的请求,struts1严重依赖于servletAPI, 属于侵入性框架,struts2不严重依赖于servletAPI,属于非侵入型框架。 线程模型方面: Struts1的Action是单实例的, 一个Action的实例处理所有的请求。 Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象), 没有线程安全方面的问题 封装请求参数: Struts1中强制使用ActionForm对象封装请求的参数。 Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。 struts1的前端总控制器(核心总控制器)为ActionServlet, struts2的前端总控制器(核心总控制器)为FilterDispather Spring MVC、struts1和struts2区别 1.spring mvc单例 非线程安全 struts1单例 非线程安全 struts2线程安全对每个请求都产生一个实例 2.spring mvc的入口是servlet,而struts2是filter spring的前端总控制器为 DispatcherServlet struts2的前端总控制器为 FilterDispatcher struts1的前端总控制器为 actionServlet 3.参数传递:struts是在接受参数的时候, 可以用属性来接受参数,这就说明参数是让多个方法共享的。 springmvc用方法来接受参数 4.spring mvc是基于方法的设计,而sturts是基于类 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! Struts2中result中的type类型 1.dispatcher:它是默认的,用来转向页面,通常处理JSP 2.redirect:将用户重定向到一个已配置好的URL 3.redirectAction:将用户重定向到一个已定义好的action 4.chain:将action和另外一个action链接起来 5.freemarker:呈现Freemarker模板 6.httpheader:返回一个已配置好的HTTP头信息响应 7.stream:向浏览器发送InputSream对象对下载的内容和图片非常有用 8.velocity:呈现Velocity模板 9.xslt :该XML可以通过XSL模板进行转换 10.plaintext:显示原始文件内容,例如文件源代码 Struts2标签 首先需要引用<%@taglib prefix="s" uri="/struts-tags"%> 1.判断标签 后面可跟 <s:else> 2. 迭代标签 3.引入标签 可以把一个JSP页面或者servlet引入一 个页面中 4.输出标签 5.标签赋予变量一个特定范围内的值 6.表单标签 7.文本域标签 8.下拉标签 9.声明一个url的路径 最常用的是: 判断 循环 输出 SSI整合 1、Action继承于Actionsupport 2、引入struts-spring-plugin.jar包,从而完成struts和spring的整合 3、在struts2的action中注入service,保证service的名字和配置文件中的一致, 并生成get,set方法 4、Dao层继承于SqlMapClientDaoSupport 5、在dao层的配置文件中注入sqlMapClient SSH整合 1.首先在web.xml中通过ContextLoaderListener来融入spring, 并加载spring的相关配置文件 2.同样配置sturts2的前端总控制器filterDispatcher来过滤相关的 请求并且加载struts.xml 3.action继承ActionSupport,然后通过引入struts-spring-plugin.jar 包并且根据配置文件中service的id生成get,set方法来注入service层。 4.dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory. 5.通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate. 在ssh框架中是怎么整合spring? 首先在web.xml中通过ContextLoaderListener来融入spring, 并加载spring的相关配置文件 在ssh框架中是怎么整合hibernate? 通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory 在ssh框架中是怎么整合struts2? 配置sturts2的前端总控制器filterDispatcher来过滤相关的 请求并且加载struts.xml 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! Spring MVC整合 1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,对指定的后缀请求进行拦截。 2.Controller层要加 @Controller注解,表明该类是MVC的控制层。 3.创建Service接口,给接口加上注解 @Component或者 @Service 表明这是Service业务处理层 4.在Controller层声明Service变量(属性),给变量(属性) 加上 @Autowired注解,通过自动绑定机制将Service注入到Controller。 (注:@Autowired默认是ByType,如果想根据属性名注入,那么就再加上注解 @Resource(name="属性名")) 5.在Controller层的方法上加上注解 @RequestMapping("requestAddress") 表明该方法的请求地址 6.Dao层要加上注解 @Repository 表明这是数据库持久层 7.同样将dao实例注入到service层中。 8.配置视图解析器 "InternalResourceViewResolver",对处理后的跳转进行统一配置。 Hibernate中get 和 load的区别 加载方式: load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才 发出sql语句); get为立即加载(执行时,会立即向数据库发出sql语句) 返回结果: load检索不到记录时,会抛ObjectNotFoundException异常 get检索不到记录时,会返回null Hibernate、Ibatis、Jdbc三者的区别 Hibernate属于全自动, Ibatis属于半自动,Jdbc属于手动,从开发效率上讲hibernate较高,ibatis居中,jdbc较低,从执行效率上讲hibernate较低,ibatis居中,jdbc较高,因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低 Hibernate的运行原理 首先通过configuration去加载hibernate.cfg.xml这个配置文件,根据 配置文件的信息去创建sessionFactory,sessionFactory是线程安全的, 是一个session工厂,用来创建session,session是线程不安全的,相当于 jdbc的connection,最后通过session去进行数据库的各种操作,在进行操作 的时候通过transaction进行事务的控制。 Hibernate五大核心(类/接口)简述 1 .Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。(加载 hibernate.cfg.xml)并创建一个SessionFactory对象。 2 .SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建 Session对象。SessionFactory是线程安全的。 3 .Session接口 Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection 4 .Query与Criteria接口 总之Query和Criteria接口负责执行各种数据库查询。 5 .Transaction接口 Transaction(事务)负责操作相关的事务。 Hibernate与JDBC的区别 [if !supportLists]1、[endif]hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库. [if !supportLists]2、[endif]Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合 [if !supportLists]3、[endif]Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。 4、如果正确的使用JDBC技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术. 5、JDBC使用的是SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行。 Hibernate中的两大配置文件 *.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。 Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含*.hbm.xml内容,映射 文件,也可以配事务。 Hibernate事务处理 开启事务session.beginTransaction(); 执行相关的操作,如果成功则session.getTransaction().commit(); 执行操作失败则session.getTransaction.rollback(); Hibernate的三种状态以及状态的转换 Transient(临时) new一个初始化对象后,并没有在数据库里保存数据,处于临时状态; Persistent(持久化) 当执行save()方法,调用session.close()方法之前,内存中的对象与数据库有对应关系处于持久化状态; Detached(托管/游离) 当执行session.close()之后,处于托管状态; 状态的转换 处于托管状态下,调用update()方法后,转换为持久化状态; 在持久化状态下,执行delete()方法后,转换为临时状态; 在未初始化对象之前,调用get(),load(),find(),iterate()之后,直接进入持久化 状态。 分页步骤 ①前台封装一个显示分页的组件 ②查询总条数 ③后台封装分页工具类,计算开始位置、结束位置、总页数 ④后台写支持分页的sql语句 ⑤前台包含分页组件,实现分页效果 注意: 查询总条数的where和查询列表信息的where条件要保证一致。 hibernate缓存概述 hibernate分为一级缓存即session缓存也叫事务级别的缓存以及 二级缓存sessionFactory即应用级别的缓存,还有查询缓存即三级缓存. 一级缓存的生命周期和session的生命周期保持一致, hibernate默认就启用了一级缓存, 不能将其关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。 二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存插件如ehcache,oscache 等。二级缓存也只能缓存对象。 三级缓存也叫查询缓存,查询缓存是针对普通属性结果集的缓存, 对实体对象的结果集只缓存id。对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! Ssh的概述: ssh是web开发中常见的一种框架 s-struts2 s-spring h-hibernate 其中struts2在框架中充当控制器,实现MVC,主要用来处理用户的请求,和跳转页面。使项目结构清晰,开发者只需要关注业务逻辑的实现即可。 spring在ssh充当粘合剂,粘合struts-sping-hibernate,主要用来进行事物的控制, hibernate-充当数据库持久层,主要用它来与数据库交互,提高开发效率,减轻程序员sql控制要求,而且hibernate通过反射机制,有灵活的映射性,还支持各种关系,一对一,一对多,多对多。 在进行ssh整合的时候,我们应该注意: 1. Action继承于ActionSupport 引入struts-spring-plugin.jar包,从而完成struts和spring的整合 在struts2的action中注入service,保证service的名字和配置文件中的一致,并生成get,set方法 Dao层继承于hibernateDaoSupport 在dao层的配置文件中注入sessionFactory 防止表单重复提交 针对于重复提交的整体解决方案: 1.用redirect来解决重复提交的问题 2.点击一次之后,按钮失效 3.通过loading 4.自定义重复提交过滤器 5.解决struts2重复提交 可以结合s:token标签来解决重复提交问题 利用token的原理: 1.在前端的jsp页面中加入s:token标签,在访问该页面时就会生成 隐藏域,该隐藏域中包含一个随机生成的字符串,并把该字符串 存入session中 2.在struts2的配置文件中加入token拦截器后,当正常访问action 的时候,会从session中取出该字符串,然后和页面隐藏域中提交 字符串做对比,如果一致则正常执行并删除session中存储的字符串。 JSP标签: 1.JSP include动作 jsp:include动作 以“<jsp: 动作名 ” 开始,以“</jsp:动作名> ” 结束 比如: 2.JSP指令:<%@ include%><%@ %> 以“<%@ ” 开始,以“%> ” 结束。比如: <%@ include file = " Filename" %> 3.JSP输出表达式:<%= %><%=Java表达式 %> 输出变量的值,后边不能加<%= ; %> 4.JSP Scriptlet【脚本】:<% ;%> <% Java 代码 %> 例子: <% Calendar now = Calendar.getInstance(); %> 5.JSP声明:<%! %> <%! 函数或者方法 %> 例子: <%! String getHello(String name) { return "Hi," + name + "!"; } %> 6.迭代标签:<c:foreach> Jstl中的核心标签(core) 7.JSP注释: <%--这也是注释,但客户端不能查看到 --%> el表达式:${} jsp:include动作是在运行时动态包含。 @include指令是在编译时包含。 它们两个都只能包含本项目的相关文件,不能包含其他项目的。 如果要包含其他项目的文件可以使用c:import 过滤器 filter的概述: filter是一个过滤器,用来在请求前和响应后进行数据的处理。 filter的生命周期是: 实例化--->初始化(init)-->进行过滤(doFilter)--->销毁(destroy)-->释放资源 一个Filter必须实现javax.servlet.Filter接口 在项目中我们通常通过filter进行编码转换, 进行安全验证,进行重复提交的判断。 了解(不需要主动说) filter 相当于 拦截器 相当于Spring AOP servlet+jsp+javabean+jdbc+filter <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.leopard.filter.EncodingFilter</filter-class> <init-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping> 拦截器的理解 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! 什么是拦截器: 拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用 正如上面Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。 在项目中,我们经常用来拦截通过非正常程序而进行的访问 Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。 其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下: <package name="demo" extends="struts-default" > ... </package> 拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作 在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。struts2中默认的拦截器是defaultStack. 自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器, 自定义拦截器有三种方式定义。分别为实现Interceptor接口,继承抽象类AbstractInterceptor,继承MethodFilterInteceptor类。 拦截器在项目中的运用: 同时可以减轻代码冗余,提高重用率。 如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。 Spring融入框架 我们通过在web.xml中配置ContextLoaderListener这个监听器也加载 spring的配置文件,从而融入到项目框架中。 项目的部署方式 1、如果项目单独部署到tomcat中的时候,应该看tomcat中的server.xml; 2、如果和eclipse结合使用进行项目部署的时候,应该看eclipse里面的server.xml.

优秀的个人博客,低调大师

如何快速学习大数据挖掘分析(个人观点)

本文梳理了学习大数据挖掘分析的思路和步骤,为大家提供了一些参考,希望能对大家有所帮助。 最近,很多人都咨询过,想学大数据,但不知道怎么开始,在哪里开始学习,需要学什么东西?对于初学者来说,学习大数据挖掘分析的逻辑是什么?本文从0开始梳理如何学习大数据挖掘分析和学习步骤,并给出一个学习建议。 希望可以帮助到大家 很多人认为数据挖掘需要掌握复杂、深刻的算法,掌握数据挖掘技术和分析技术是很有必要的。如果你钻研复杂的算法和技术开发,你只会让自己发疯,而且会越来越难。在公司的实际工作中,最好的大数据挖掘工程师必须是最熟悉和理解的人。对于大数据挖掘的学习,笔者认为学习数据挖掘必须结合实际的业务背景和案例背景进行研究,这是一种面向问题的学习方法。因此,一般来说,大数据挖掘分析的经典案例如下: 预测用户在下一段时间内是否会丢失或丢失。 该公司做了一个促销活动来预测活动的效果以及用户如何接受它。 评估用户的信用度。 细分现有客户市场,哪些客户是目标客户? 产品投放市场后,用户转换率和哪种运营策略最有效? 运营已经做了大量的工作,公司资源也投入了很多,如何提高产品投入产出比; 有些用户购买大量商品,哪些商品同时购买。 预测产品在未来一年的销售额和收入。 大数据挖掘需要将上述类似的业务运作问题转化为数据挖掘问题。 首先,如何将业务运营问题转化为大数据挖掘问题。 所以,问题是,我们应该如何将上述业务操作转化为数据挖掘问题?我们可以将数据挖掘问题细分为四类:分类、聚类、关联和预测。 1、分类问题 用户的流失率、促销活动的响应和用户度的评价属于数据挖掘的分类问题。我们需要掌握分类的特点,知道什么是监督学习,掌握常用的分类方法:决策树、拜厄斯、KNN、支持向量机、神经网络和Logistic回归。 2,聚类问题 细分市场和客户群细分属于数据挖掘的聚类问题。我们需要掌握聚类的特点,了解无监督学习,理解常用的聚类算法,如分区聚类、层次聚类、密度聚类、网格聚类、模型聚类等。 三。相关问题 交叉销售与相关问题相关,关联分析也被称为购物篮分析。我们需要掌握常用的关联分析算法:Aprior算法、CARMA算法、序列算法等。 4、预测问题 我们应该掌握简单的线性回归分析、多元线性回归分析、时间序列等。 二。你用什么工具做大数据挖掘? 有很多工具和方法来实现数据挖掘,如SPSS、SAS、Python、R等等,但是我们需要掌握什么或掌握什么来学习数据挖掘?这取决于你在做什么,你想去哪里。 第一层次:达到理解水平 理解统计和数据库。 二级:达到初级职场应用水平 数据库+统计+ SPSS(也可以是SPSS而不是软件)。 第三级:达到中层应用水平 SAS或R 第四级:达到数据挖掘的划分层次 SAS或R+Python(或其他编程语言) 三。如何使用Python学习大数据挖掘 只要我们能解决实际问题,我们用什么工具来学习数据挖掘并不重要。Python是这里首先要做的事情。如何使用Python来学习数据挖掘?关于Python你需要知道什么? 1大熊猫图书馆的运作 熊猫是一个非常重要的数据分析数据库。我们要掌握以下三点: 熊猫分组计算; 大熊猫指数和多重指数; 这个索引很难,但是很重要。 熊猫多桌经营与PivotTable 2元数值计算 数据计算是数据挖掘的主要应用,对于未来的机器学习、深入的学习来说,这也是一个必须掌握的库,我们必须掌握以下几点: 麻木阵列的理解; 数组索引操作; 数组计算; 广播(线性代数知识) 三。数据可视化- MatPultLIB和海运 Mat普罗蒂布文法 Python最基本的可视化工具是Matplotlib。让我们看看MatMattLIB有点像MatLabb。我们需要弄清楚两者之间的关系,这样就更容易学了。 海运的使用 Seabn是一个非常漂亮的可视化工具。 熊猫绘图功能 正如我之前所说的,熊猫正在做数据分析,但它也提供了一些绘图的API。 4。数据挖掘导论 这部分是最困难和最有趣的部分。我们应该掌握以下几个部分: 机器学习的定义 数据挖掘并没有什么区别。 成本函数的定义 培训/测试/验证 过拟合的定义与避免 5。数据挖掘算法 随着数据挖掘的发展,有很多算法。接下来,我们需要掌握最简单、最核心和最常用的算法。 最小二乘算法; 梯度下降; 矢量化; 极大似然估计; 逻辑回归; 决策树; RandomForesr; XGBoost; 6、数据挖掘实战 通过机器学习,最著名的图书馆SCIKIT学习了解模型。 以上是大数据挖掘的学习逻辑的逻辑。然而,这仅仅是个开始,在数据挖掘和数据科学家的道路上,我们必须学习文本处理和自然语言知识、Linux和火花知识、深入的学习知识等等,并且我们需要对数据挖掘保持持续的兴趣。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册