SSH框架知识点 |
|
|
Strucs的创建1.2.自动有包3.配置(1)struts.xml(2)HelloWorldAction.java(3)web.xml(4 )sayHello.jsp【Message之所以能取到值,只需要java文件中有与此同名的变量就行】//这里面的字段都会被拦截器 访问,在jsp页面直接通过相同的字段名取值//每一个字段都设置get、set方法省去了servlet里面的request.get Parameter("userName");和request.getSession().setAttribute("userNam e",userName);atlr-2.7.2.jar是一个语言包,可以去除struts标签通常不直接用。(必须访问HelloW orld.action)<%@taglibprefix="s"uri="/struts-tags"%>value="message"/>而是用 ${message}(HelloWorld.jsp访问这个不会报错,页面空白) 配置ctionname="HelloWorld"class="com.pxy.struts2.action.HelloWorld" >/HelloWorld.jsp>s="com.pxy.struts2.action.ShowUserInfo"method="{1}">s"type="dispatcher">/showUserInfo.jsp>Package的name包名是没有什么意义的;Action的name是访问的地址栏的地址配置me>struts2aaaorg.apache.struts2.dispa tcher.ng.filter.StrutsPrepareAndExecuteFilterter>struts2aaa.actiong>验证:自校验的时候需要继承extendsActionSupport才有addFieldError方法此自定义方法执行之前会默 认先执行验证方法validateXxx()重写validateXxx()方法【必须这个格式】将错误提示信息添加至fieldErro rs中该"user.userName"键名一定要与表单中被校验的参数名一致执行重写validateXxx()的方法前,user 里面已经是有值得publicclassHelloWorldActionextendsActionSupport{priv ateUseruser;publicUsergetUser(){returnuser;}publicvoidset User(Useruser){this.user=user;}privateStringmessage;//定义me ssage属性publicStringgetMessage(){returnmessage;}//----------- ---------------begin-------------------------------------------// 重写validateSayHelloate()方法publicvoidvalidateSayHello(){if(! user.getUserName().equals("aaa")){//将错误提示信息添加至fieldErrors中//该" user.userName"键名一定要与表单中被校验的参数名一致this.addFieldError("user.userName ","用户名不存在或者密码错误!");}}//此自定义方法执行之前会默认先执行验证方法validate()publicStr ingsayHello(){message="HelloWorld"+" "+user.getUserN ame();return"success";}//---------------------------end-------- ----------------------------------}s="com.pxy.struts2.action.HelloWorldAction"method="sayHello">her">/sayHello.jsp/index.jsp正则表达式参考代码://邮箱正则表达式 StringemailRegex="\\b^[''_a-z0-9-\\+]+(\\.[''_a-z0-9-\\+]+)@[a-z 0-9-]+(\\.[a-z0-9-]+)\\.([a-z]{2}|aero|arpa|asia|biz|com|coop|ed u|gov|info|int|jobs|mil|mobi|museum|name|nato|net|org|pro|tel|tra vel|xxx)$\\b";//身份证号正则表达式StringidCardRegex="(\\d{14}[0-9a-zA-Z] )|(\\d{17}[0-9a-zA-Z])";//手机号正则表达式StringphoneNoRegex="^((13[0-9 ])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";Struts2的一些常用类型校验器见下表。内置校验器类 型说明required不允许为空。用于非字符串类型requiredstring不允许为空。仅用于非字符串类型int必须是合法的i nt类型long必须是合法的long类型double必须是合法的double类型date必须是合法的日期类型email必须是合法的 email格式url必须是合法的url格式stringlength判断字符串的长度是否合法regex使用正则表达式进行校验http ://blog.csdn.net/a6717043/article/details/8284819Action类为何要继承Acti onSupportAction跟Actionsupport的区别:当我们在写action的时候,可以实现Action接口, 也可以继承Actionsupport这个类.到底这两个有什么区别呢?Action接口有:?publicstaticfinal? Java.lang.StringSUCCESS="success";???publicstaticfinaljava. lang.StringNONE="none";??publicstaticfinaljava.lang.String ERROR="error";???publicstaticfinaljava.lang.StringINPUT=" input";?publicstaticfinaljava.lang.StringLOGIN="login";?p ublicabstractjava.lang.Stringexecute()throwsjava.lang.Except ion;??而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该 方法,它会在execute()方法之前执行,如校验失败,会转入input处,必须在配置该Action时配置input属性。?另 外,Actionsupport还提供了一个getText(Stringkey)方法还实现国际化,该方法从资源文件上获取国际化信息 .这样在自定义标签时可以定义一个变量为newactionsupport对象实现国际化。?ActionSupport类的作用s truts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的act ion,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的publi cStringexecute()throwsException方法。因为此类中实现了很多的实用借口,提供了很多默认方法, 这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。?Struts2中通常直接使用 Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和set ter方法获取action中的sessionpublicclassLoginActionextendsActionSup port{privateStringaccount;privateStringpassword;publicS tringlogin(){if("admin".equals(account)&&"123456".equals(pass word)){HttpSessionsession=ServletActionContext.getRequest().getS ession();//将用户账号保存至session范围内session.setAttribute("account",a ccount);return"success";}else{return"login";}//以下省略accoun t和password属性的getter和setter方法}1.验证Struts2提供了两种方式的输入校验,一种是基于手动的输入校验 。一种是基于配置方式的输入校验。如果需要对Action类中execute()方法进行输入定义,需要定义validate()方法 。如果需要对Action类中Xxx()方法进行输入定义,需要定义validateXxx()方法。对于校验配置文件,需要注意以 下几点:1.被校验的Action要与校验该Action的校验配置文件在同一个包中。2.校验配置文件的名称应为:被校验Action的 类名-struts.xml文件中action的name属性值-validation.xml。后面加粗的内容是固定不变的。2.拦截器 拦截器按照类型可分为内置拦截器和自定义拦截器,按照拦截范围可分为类范围拦截器和方法拦截器如果自定义一个类范围的拦截器,需要继承抽象 类AbstractIntecptor。自定义一个方法拦截器则需要继承MethodFilterInterceptor,还需要在str uts.xml文件中通过includeMethods参数指定被拦截的方法。?(1)?name:这是一个必须的属性,该属性指定该包 的名字,该名字是该包被其他包引用的key。(2)?extends:该属性是一个可选属性,该属性指定该报继承其他包。继承其他包, 就可以继承其他包中的Action定义、拦截器定义等。(3)?namespace:该属性是一个可选属性,该属性定义该包的命名空间 。(4)?abstract:该属性是一个可选属性,他指定该包是否是一个抽象包,在抽象包中不能有package属性。因为Str uts2的配置文件时从上到下进行处理,所以父包应该在子包的前面定义。下面是一个简单的struts.xml文件配置文件范例。在下面 的struts.xml文件中配置两个包,其中名为default的包,继承了Struts2框架的默认包:struts-default 。???DTD?Struts?Configuration?2.0//EN"?"http://struts.apache.org/dtds/ struts-2.0.dtd">?????????default">?????? ??????terceptor-stack?name="crudeStack">???? ??Stack"?/>????????????ss=""?method=""?convertor="">????aram?name="参数名">参数值????ult>showcase.jsp?? ??????ult?name="success">/date.jsp???????--定义一个名为skill的包,该包直接继承default的包-->??="default"?namespace="/skill">????ceptor-ref?name="crudeStack"?/>????n">??/empmanager/editskill.jsp???name="params"?/>????n>??????name="input">/empmanager/editSkill.jsp??direct">edit.action?skillName=${currentSkill.name}?????< /action>????上面的struts.xm文件中第一个package中定义继承了一个s truts-default父包,那这个父包位于何处呢?其实它位于struts核心jar包struts2-core-2.x.x.ja r文件中,只要解压该文件就能看到一个struts-default.xml文件。从上面的配置片段就可以看出,struts2-cor e-2.x.x.jar里已经定义了struts-default抽象包,该包下包含了大量的结果类型定义、拦截器定义、拦截器引用定义等 ,这些定义是配置普通Action的基础,所以开发者的package通常应该继承于struts-default包。注意:实际上所有 struts2插件文件都会提供一个struts-plugin.xml文件,而不同的struts-plugin.xml文件会定义另一 个抽象包,用于被需要使用该插件的开发者继承,所以如果我们使用struts2中的某个插件时,可能需要用到struts插件文件中的包。 二.命名空间从前面的内容可知,每定义一个package元素时,都可以指定一个namespace属性,用于指定该包对应的命名空间 。?Struts2只所以提供命名空间的功能,主要是为了处理同一个web应用中包含同名的Action的情形,Struts2以命名空间 方式来管理Action,同一个命名空间中不能有相同的Action,不同的命名空间中可以有不同的Action。Struts2不支持 为单独的Action设置命名空间,而是通过包指定namespace属性来为包下面的所有Action指定共同的命名空间。如果配置pa ckage时没有指定namespace属性,那么包下的所有Action处于默认的包空间下。下面用一个应用示例来说明Struts2 的命名空间的用法。看下面的struts.xml文件中的代码这份配置文件中配置两个package,并为后一个package指定了命名 空间为/book。???dation//DTD?Struts?Configuration?2.0//EN"?"http://struts.apache.o rg/dtds/struts-2.0.dtd">??? ????alue="messageResource"/>????? ?????????name?="input">/login.jsp??/error. jsp??/success.jsp??ction>???????name="get"?extends="struts-default"?namespace?=?"/book">????sAction">??/login.jsp??e?=?"success">/success.jsp?????ts>?自己测试的拦截器项目Simple_Struts>tsConfiguration2.1//EN""http://struts.apache.org/dtds/struts-2 .1.dtd">-default">e"class="com.csa.struts2.action.UserManageInterceptor">tor>nterceptor">_"class="com.csa.struts2.action.UserManage"method="{1}">name="input"type="dispatcher">/{1}.jspccess"type="dispatcher">/{1}_ok.jsptype="dispatcher">/login.jspefname="UserManage"/>"> queryor-refname="defaultStack"/>package com.csa.struts2.action;importcom.opensymphony.xwork2.ActionCont ext;importcom.opensymphony.xwork2.ActionInvocation;importcom.op ensymphony.xwork2.interceptor.MethodFilterInterceptor;publicclas sQueryInterceptorextendsMethodFilterInterceptor{//方法拦截器@Over rideprotectedStringdoIntercept(ActionInvocationinvocation)thr owsException{ObjectisLogin=ActionContext.getContext().getSes sion().get("isLogin");if(isLogin!=null&&(Boolean)isLogin== true){returninvocation.invoke();}else{return"login";}}}pack agecom.csa.struts2.action;importcom.opensymphony.xwork2.ActionI nvocation;importcom.opensymphony.xwork2.interceptor.AbstractInte rceptor;publicclassUserManageInterceptorextendsAbstractInterc eptor{@OverridepublicStringintercept(ActionInvocationinvocati on)throwsException{System.out.println("我是类拦截器");returninvocat ion.invoke();}}3、拦截器栈拦截器同样有栈的概念,它是将使用的拦截器定义到共有的状态下来实现统一管理,这样在pa ckage中就可以做到拦截器的共享了,大大便利了拦截器的使用。在一个package中往往会用到重复的interceptor,如果每 次都在Action中添加interceptor-ref的话就会很麻烦,那么拦截器栈就是为了解决这个问题而产生的,具体配置如下:实 例中使用了interceptor-stack来定义了一个名称为defaultstack1的拦截器栈,在该栈中添加了要执行的拦截器, 把拦截器做了封装,在Action中直接调用该拦截器栈即可,实现了拦截器栈的共享。获取session的三种方式//此处获取的是键值 对MAPActionContext.getContext().getSession().get("isLogin")//这里获取 的是session的对象ServletActionContext.getRequest().getSession().getAtt ribute("isLogin");//继承SessionAware实现setSession方法@Overridepublicv oidsetSession(Mapsession){this.session=sessi on;}验证的步骤:输入表单信息,点击确定通过submit跳去struts中,比较action的name,跳到对应的action包 下面的action-java文件,执行指定的方法,再返回到struts中,根据字符结果,跳到不同的页面验证信息是在访问struts 的时候就开始执行的,因为有很多默认的拦截器在工作上传:文件夹要按【年-月-日】分,不要把所有的文件放到一个文件夹【网盘】检测MD5 码和文件大小4.1版本下需要在加上HibernateADD设置收藏夹找出要增加收藏夹的用户为该用户绑定收藏夹(add)收藏夹se t该用户Transactiontx=session.beginTransaction();保存该用户session.save OrUpdate(user);tx.commit();session.close();Hibernate级联删除delete文件里 面的set中设置直接删除用户就可以了,会自动删除引用该用户的所有表rue"cascade="delete">或者ade="all">publicstaticvoidcascadeDelete(){Sessionsession=H ibernateSessionFactory.getSession();MyUseruser=(MyUser)sessio n.get(MyUser.class,11);//Setfavorites=user.getFavo rites();//favorites.remove(user);Transactiontx=session.beginT ransaction();session.delete(user);tx.commit();session.close();Sys tem.out.println("成功");}HQL分页分页检索Query.setFirstResult(intfirstRe sult)设置从firstResult位置开始检索索引位置的起始值为0默认情况下,Query接口从查询结果中的第一个对象,也就 是索引位置为0的对象开始检索Query.setMaxResult(intmaxResult)设置检索maxResult条数据S pring中new对象SSH整合:连接数据库的是sql没问题,如果是mySQl就会少一个ction.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver< /property>dao包里面要继承HibernateTemplatehibernate里面自动提交事务配置name="connection.autocommit">true维护数据与数据之间的关系在service层 Service之间可以相互调用,但是dao之间不可以Struct:页面地址栏的控制Hibernate:好多方法都在这里面调用Spr ing:相当于创建对象增删改提交事务的时候1.方法一Spring中的applicationContext.xml配置如下sxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="h ttp://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.spr ingframework.org/schema/p"xmlns:tx="http://www.springframework.or g/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop "xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdh ttp://www.springframework.org/schema/txhttp://www.springframewor k.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/s chema/aophttp://www.springframework.org/schema/aop/spring-aop-3. 1.xsd">m.hibernate3.HibernateTransactionManager">Factory"ref="sessionFactory">vice"transaction-manager="transactionManager">:methodname=""propagation="REQUIRED"/>vice>ion(com.chinasoft.dao.impl..(..))"/>要改的就是pointc ut="execution(com.chinasoft.dao.impl..(..))"/>当做整合的时候Spring接 管了hibernate中的事物,故要配置方法二publicvoiddelete(intuserId){Sessionse ssion=this.getSession();Transactiontx=session.beginTransacti on();MyUsermyUser=getMyUserByID(userId);session.delete(myUser) ;tx.commit();session.close();}这样的话以后每一个方法里面都需要手动开启关闭事物获得总页数:publi cintgetTotalpages(){Stringhql="selectcount()fromEmploye e";return((Number)this.getSession().createQuery(hql).setMaxResu lts(1).uniqueResult()).intValue();}框架拦截器的乱码解决publicclassEncodeI nterceptorextendsAbstractInterceptor{@OverridepublicStringin tercept(ActionInvocationinvocation)throwsException{HttpServle tRequestrequest=(HttpServletRequest)ActionContext.getContext( ).get(ServletActionContext.HTTP_REQUEST);HttpServletResponseresp onse=(HttpServletResponse)ActionContext.getContext().get(Servl etActionContext.HTTP_RESPONSE);if(request.getMethod().compareToI gnoreCase("post")>=0){try{request.setCharacterEncoding("utf-8 ");}catch(UnsupportedEncodingExceptione){e.printStackTrace(); }}else{Iteratoriterval=request.getParameterMap().v alues().iterator();while(iterval.hasNext()){String[]parames= iterval.next();for(inti=0;iames[i]=newString(parames[i].getBytes("iso8859-1"),"utf-8");} catch(UnsupportedEncodingExceptione){e.printStackTrace();}}}} response.setContentType("text/html;charset=UTF-8");response.setHe ader("Cache-Control","no-cache");returninvocation.invoke();}}自动 数据校验
用户名不能为空--------r>gth">106用户名必须在${minLength}-${maxLength}位之间1040年龄必须在${min}--${max}之间1974-01-012004-12-31生日必须在${min}年到${max}年之间邮箱格式不正确url不能这空,类似于http://www.baidu.com电话号码必须是135xxxxxxxx两次密码输入不一致z |
|
|
|
|
|
|
|