1、SSH学习笔记王利江7月1. Struts141.1 TCP/IP合同组41.2 术语和缩写词41.3 遵循原则42. Struts252.1struts2长处52.2开发struts2至少需要jar文献52.3 struts2解决流程62.4 struts2struts.xml配备文献62.4.1 action配备项62.4.2 struts2常量82.4.3指定各种配备文献92.5 接受祈求参数92.5.1基本类型祈求参数92.5.2复合类型祈求参数92.5.3版本2.1.6中午参数乱码问题102.6类型转换器102.6.1局部类型转换器102.6.2全局类型转换器112.7访问添加属性1
2、12.8文献上传122.8.1单文献上传122.8.2多文献上传132.9自定义拦截器152.10输入校验162.10.1输入校验流程162.10.2手工编码实现162.10.3基于XML配备方式实现182.11国际化212.12OGNL表达式232.13惯用标签262.14防止表单重复提交293. Spring313.1实例化313.1.1 spring容器实例化313.1.2 bean实例化313.1控制反转IOC323.1.2个人令牌版324. Hibernate334.1安装配备333.1.2个人令牌版335. Ibatis344.1正则表达式343.1.2个人令牌版346. Thre
3、ad多线程356.1创立线程两种方式356.1.1继承Thread类356.1.2实现Runnable接口356.2互斥与同步通讯366.3ThreadLoacl类376.4各种线程访问共享对象和数据方式386.5线程池406.x练习题407. AJAX437.1使用dom方式开发ajax实例437.1.1返回格式为Text文本437.1.2返回格式为XML格式数据457.2使用dom方式开发ajax实例461. Struts11.1 TCP/IP合同组TCP/IP是一组在Internet网络上不同计算机之间进行通信合同群,它是由TCP(传播控制合同)、IP(Internet合同)、UDP(顾
4、客数据报合同)、HTTP(超文本传播合同)、FTP(文献传播线合同)、SMTP(简朴邮件传播合同)等一系列合同构成。它们从下往上可以分为四层构造:l 物理层(以太网、令牌环、X.25等)l 网络层(IP合同)l 传播层(TCP合同、UDP合同)l 应用层(HTTP合同、FTP合同、SMTP合同等)从一台计算机发往另一台计算机数据都是按如下顺序发送和接受:发送数据计算机先将数据传到应用层,由上往下传送,数据通过每一层时,所使用合同都给数据加上一种合同头,然后将加上合同头数据传到下一层,下一层所使用合同在给它加上一种合同头,继续向下传递,最有由物理层经硬件设备发送到网络上。接受数据计算机则相反,数
5、据时由下往上传递,每通过一层都剥去相应合同头,然后继续向上传递。最后传递给顾客数据是剥去所有合同头数据,即原始数据。假设你浏览器想从网路上运营WEB服务器上获取数据,它先将一种HTTP祈求发送到TCP层,加上一种TCP端口地址后发往IP层,IP层在给它加上一种IP地址,通过物理层将此祈求发往网络上指定计算机。在接受数据一方,每层都剥去相应地址信息,然后决定下一步该做什么。物理层在接受到消息后,将数据发往IP层,IP层发现这是一种包,将剥去IP头数据发往TCP层,TCP层再将剥去TCP头数据发送给计算机上运营HTTP服务代理,HTTP代理依照这个祈求进行相应解决,然后再将成果按照相应途径返回给祈
6、求者。1.2 术语和缩写词无。1.3 遵循原则 本文档遵循宇新数据科技有限公司需求分析阐明书编写规范。2. Struts22.1struts2长处和struts1 相比,struts2长处列举如下:n 在软件设计上struts2没有像struts1那样Servlet API和Struts API有着紧密耦合,struts2应用可以不依赖于Servlet API和Struts API,属于无侵入式设计,而struts1属于侵入式设计。n Struts2提供了拦截器,运用拦截器可以进行AOP编程,实现如权限拦截等功能。n Struts2提供了类型转换器,可以把特殊祈求参数转换为需要类型。n Str
7、uts2提供支持各种体现层技术,如:jsp、freeMarker、velocity等n Struts2输入校验可以对指定办法进行校验n 提供了全局范畴、包范畴和action范畴国际化资源文献管理实现2.2开发struts2至少需要jar文献n Struts 2.1.6 和struts2.1.8l Struts2-core-2.x.x.jar:struts2框架核心类库。l Xwork-2.x.x.jar:xwork类库,struts2在其基本上构建。l Ognl.2.6.x.jar:对象图导航语言(Object Graph Navigation Language),struts2通过其读写对象
8、属性。l freeMarker-2.3.x.jar:Struts2UI标签模板使用freeMarker编写l commons-logging-1.1.x.jar:ASF出品日记包,struts2框架用这个日记包来支持Log4j和JDK 1.4+日记记录l commons-fileupload-1.2.1.jar:文献上传组件,2.1.6后来版本必要加入该组件n Struts 2.3.4l Struts2-core-2.x.x.jar:struts2框架核心类库。l Xwork-2.x.x.jar:xwork类库,struts2在其基本上构建。l Ognl.2.6. x.jar:对象图导航语言(
9、Object Graph Navigation Language),struts2通过其读写对象属性。l freeMarker-2.3.x.jar:Struts2UI标签模板使用freeMarker编写l commons-logging-1.1.x.jar:ASF出品日记包,struts2框架用这个日记包来支持Log4j和JDK 1.4+日记记录l commons-fileupload-1.2.1.jar:文献上传组件,2.1.6后来版本必要加入该组件l javassist-3.11.0.GA.jarl commons-lang3-3.1.jarl commons-io-2.0.1.jar2.
10、3 struts2解决流程StrutsPrepareAndExecuteFilter是struts2框架核心控制器,它负责拦截友/*指定所有顾客祈求,当顾客祈求到达时,该Filter会过滤顾客祈求。默认状况下,如果顾客祈求途径不带后缀或者后缀以.action结尾,这时祈求将被转入struts2框架进行解决,否则struts2框架将略过该祈求解决。当祈求转入struts2框架解决时会先通过一系列拦截器,然后再到action。与struts1不同,struts2对顾客每次祈求都会创立一种action,因此struts2中action是线程安全。2.4 struts2struts.xml配备文献2.
11、4.1 action配备项n action名称搜索顺序URL:http:/lserver/struts2/path1/ path2/ path3/helloworld.actionl 环节一:一方面寻找namespace为/path1/ path2/ path3package,如果不存在这个package则执行环节二,如果存在这个package则在这个package中寻找名字为helloworldaction,如果找不到action就会直接跑到默认namespace(默认命名空间为空字符串“”),如果默认命名空间package中还找不到,页面提示找不到actionl 环节二:寻找namespa
12、ce为/path1/ path2package,如果不存在这个package则执行环节三,如果存在这个package则在这个package中寻找名字为helloworldaction,如果找不到action就会直接跑到默认namespace(默认命名空间为空字符串“”),如果默认命名空间package中还找不到,页面提示找不到actionl 环节三:寻找namespace为/path1package,如果不存在这个package则执行环节四,如果存在这个package则在这个package中寻找名字为helloworldaction,如果找不到action就会直接跑到默认namespace(默
13、认命名空间为空字符串“”),如果默认命名空间package中还找不到,页面提示找不到actionl 环节四:寻找namespace为/package,如果存在这个package则在这个package中寻找名字为helloworldaction,当在package中找不到action或者不存在这个package时,都会去默认namespacepackage中寻找action,如果还找不到,页面提示找不到actionn action配备项默认值/WEB-INF/page/employeeAdd.jspl 如果没有为action指定class,默认是ActionSupportl 如果没有为actio
14、n指定method,默认执行actionexecute()办法l 如果没有指定resultname属性,默认执行successn actionresult惯用配备项l dispactcher :默认值,祈求转发,类似于struts1中forwardl redirect:祈求重定向/index.jsp?username=$usernamel redirectAction:将祈求重定向到其他actionhelloworld如果重定向到其她package中action,需要为redirectAction注入两个参数:其她package命名空间和action名称,如: actionName/names
15、pace l plaintext:显示原始文献内容/index.jsp当原始文献内容包括特殊编码字符,如果需要正常显示原文献内容,需要为plainText注入两个参数:原始文献途径location和使用字符集charSet,如:/index.jspUTF-8n 为action类属性注入参数/inmages/WEB-INF/page/hello.jspn 动态办法调用动态办法调用方式为:actionName!method.action,如:helloworld!addUI.actionn 使用通配符employee/WEB-INF/page/hello.jsp1表达“list_*”中第一种*代表
16、字符串。在访问时候使用list_addUI表达是访问action名称为listaddUI办法2.4.2 struts2常量n struts2常量加载顺序struts-default.xmlstruts-plugin.xmlstruts.xmlstruts.propertiesweb.xml如果在各种文献中都配备了同一种常量,则后一种文献中配备常量值会覆盖前面文献中配备常量值。n 惯用struts2常量l 指定默认编码集,作用于HttpServletRequestsetCharacterEncoding办法和freeMarker、velocity输出编码:l 指定struts2解决祈求后缀,该属
17、性默认值为action,即所有匹配*.action祈求都由struts2负责解决,如果顾客需要指定各种祈求后缀,则在各种祈求后缀之间用英文逗号分隔。也可以设立同步解决各种action后缀,value值用“,”分割即可,如下:l 设立浏览器与否缓存静态内容,默认值为true(生产环境使用),开发环境建议关闭。l 当struts2配备文献修改后,系统与否自动加载该文献,默认值为false(生产环境使用),开发阶段建议打开。l 开发模式下使用,可以打开更详细错误信息。l 默认视图主题l 与spring集成时,指定由spring负责action创立备注:2.3.4版本有变化l Struts2与否支持动
18、态办法调用,默认值为true,如要关闭动态办法调用,可以设立为falsel 上传文献大小限制2.4.3指定各种配备文献2.5 接受祈求参数2.5.1基本类型祈求参数在action类中定义与祈求参数同名属性,struts2便能自动接受祈求参数并赋予给同名属性。祈求途径为:http:/localhost:8080/struts2/control/employee/product.do?id=12345public class ProductAction private Integer id;public Integer getId() return id;/Struts2通过反射技术调用与祈求参数
19、同名属性setter办法来获取祈求参数值public void setId(Integer id) this.id = id;Form使用举例:id:name:2.5.2复合类型祈求参数祈求途径为:http:/localhost:8080/struts2/control/employee/product.do?pd.id=12345public class ProductAction private Product product;public Product getProduct) return product;public void setProduct (Product product)
20、 this. product = product;Struts2一方面通过反射技术调用Product默认构造器创立product对象,然后再通过反射技术调用product中与祈求参数同名属性setter办法来获取祈求参数值。Form使用举例:id:name:2.5.3版本2.1.6中午参数乱码问题2.6类型转换器自定义类型转换器需要实现struts2类型转换器类DefaultTypeConverter,并重写该类convertValue办法:如下public class DateTypeConverter extends DefaultTypeConverter Overridepublic
21、Object convertValue(Map context,Object value,Class toType) SimpleDateFormat dateFormat = new SimpleDateFormat(yyyyMMdd);try if (toType = Date.class) String params = (String) value;/ request.getParameterValues();System.out.println(StringToDate = +params.length);System.out.println(StringToDate = +para
22、ms0);System.out.println(StringToDate = +dateFormat.parse(params0);return dateFormat.parse(params0); else if (toType = String.class) Date date = (Date) value;System.out.println(DateToString = +dateFormat.format(date);return dateFormat.format(date); catch (ParseException e) e.printStackTrace();return
23、null;2.6.1局部类型转换器将DateTypeConverter注册为局部类型转换器:在action类所在包下放置ActionClassName-conversion.properties文献,ActionClassName是action类名,背面-conversion.properties是固定写法,如:文献名称为HelloWordAction-conversion.properties,在properties文献中内容为:属性名称=类型转换器全类名 例如,对HelloWordActionprivate Date birthday;字段进行转换为:birthday=com.spring
24、.type.converter. DateTypeConverter2.6.2全局类型转换器将DateTypeConverter注册为全局类型转换器:在WEB-INF/classes下放置xwork-conversion.properties文献,在properties文献中内容为:待转换类型=类型转换器全类名,即为:java.util.Date=com.spring.type.converter. DateTypeConverter2.7访问添加属性访问或添加request/session/application属性n 方式一:使用struts2ActionContext类,使用如下:pub
25、lic String execute() throws Exception ActionContext ctx = ActionContext.getContext();ctx.getApplication().put(app,应用范畴);ctx.getSession().put(ses,session范畴);ctx.put(res,request范畴);return success;JSP中使用如下:$applicationScope.app$sessionScope.ses$requestScope.resn 方式二:使用struts2servletActionContext类,获取Htt
26、pServletRequest、HttpSession、ServletContext、HttpServletResponse等对象引用,然后通过setAttribute办法设立属性值。public String rsa() throws Exception HttpServletRequest request = ServletActionContext.getRequest();ServletContext context = ServletActionContext.getServletContext();HttpSession session = request.getSession()
27、;HttpServletResponse response = ServletActionContext.getResponse();request.setAttribute(req,祈求范畴属性);context.setAttribute(app,应用范畴属性);session.setAttribute(ses,会话范畴范畴);request.setAttribute(names,Arrays.asList(张三,李斯,王五);return success;JSP中使用如下:/引入jstl标签库,需要导入standard.jar和jstl.jar文献$applicationScope.app
28、$sessionScope.ses$requestScope.res$namen 方式三:实现ServletRequestAware、ServletResponseAware、ServletContextAware接口,由struts2框架运营时注入。public class HelloWorldAction implements ServletContextAware,ServletRequestAware,ServletResponseAware private HttpServletRequest request;private HttpServletResponse response;
29、private ServletContext context;Overridepublic void setServletResponse(HttpServletResponse response) this.response = response;Overridepublic void setServletRequest(HttpServletRequest request) this.request = request;Overridepublic void setServletContext(ServletContext context) this.context = context;p
30、ublic String execute() throws Exception this.request.setAttribute(req,祈求范畴属性);this.context.setAttribute(app,应用范畴属性);HttpSession session = this.request.request.getSession();session.setAttribute(ses,会话范畴范畴);return success;2.8文献上传2.8.1单文献上传n 第一步:在WEB-INF/lib下加入commons-fileupload-1.2.2.jar、commons-io-2.
31、0.1.jarn 第二步:把form表enctype设立为“multipart/form-data”,如下:n 第三步:在action类中添加属性名称public class FileuploadAction private File image;/得到上传文献private String savePath;/文献保存途径/struts2默认命名规则:文献属性名称 + FileName/ContentTypeprivate String imageFileName;/得到上传文献名称,private String imageContentType;/得到上传文献类型public String
32、execute() throws Exceptionif(image = null)return fileupload;String realPath = ServletActionContext.getServletContext().getRealPath(savePath);File saveFile = new File(new File(realPath),imageFileName);if(!saveFile.getParentFile().exists()saveFile.getParentFile().mkdirs();FileUtils.copyFile(image,save
33、File);ActionContext.getContext().put(message,文献上传成功);return success;public File getImage() return image;public void setImage(File image) this.image = image;public String getSavePath() return savePath;public void setSavePath(String savePath) this.savePath = savePath;public String getImageFileName() r
34、eturn imageFileName;public void setImageFileName(String imageFileName) this.imageFileName = imageFileName;public String getImageContentType() return imageContentType;public void setImageContentType(String imageContentType) this.imageContentType = imageContentType;n 第四步:配备action属性/设立上传文献大小为10M,struts
35、2默以为2M/配备上传action类/images/WEB-INF/page/massage.jsp2.8.2多文献上传n 第一步:在WEB-INF/lib下加入commons-fileupload-1.2.2.jar、commons-io-2.0.1.jarn 第二步:把form表enctype设立为“multipart/form-data”,如下:文献1:文献2:文献3: n 第三步:在action类中添加属性名称public class FileuploadAction private File image;/得到上传文献private String savePath;/文献保存途径/struts2默认命名规则:文献属性名称 + FileName/ContentTypeprivate String imageFileName;/得到上传文献名称,private String imageContentType;/得到上传文献类型public String execute() throws Exception if (image = null) return fileupload;String realPath = ServletActionContext.getServletContext().getRealPath(savePath);System.out.pri