上传一份个人学习struts2的历程笔记

简介:

1、02_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi

指定Tomcat的目录,指定JDK搭建开发环境(拷贝jar包,复制struts.xml文件 此文件不要放在WEB-INF下面,应该放到src下面

),在web.xml文件中:

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

其中<url-pattern>/*</url-pattern> 不要写/*.do 或者 /*.action约定俗成用/*

2、04_尚学堂马士兵_Struts2_Struts2_HelloWorld_3.avi

(1)

<!--<constant >:常量的配置 -->

<!--name="struts.devMode" value="true":当前是开发模式,改动配置文件会自动装载 默认是false-->

<!--命名空间 ---> action -->相应的处理类或页面 -->

<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">

<action name="hell" class="package + class xxxx">

<result>

/Hello.jsp

</result>

</action>

</package>

(2)struts.xml不自动提示的解决办法: window--perferences-XML catalog---add---key Type="URI" key="*.dtd"

3、09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.avi

struts2的执行流程:

当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给那个WebApplication

来处理,然后会读取它下面的web.xml配置发现有配置:

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>因为<url-pattern> 为/* 它会过滤所有的请求然后就交给filter类

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter处理执行调用doFilter()方法,然后再方法中会读

取struts.xml文件,根据用户请求的地址找到相应的package、 action、 result、然后将相应的页面返回给浏览器

4、10_尚学堂马士兵_Struts2_Struts2_Namespace_命名空间.avi

(1)namespace决定了action的访问路径,默认为"",可以接收所有路径的action

namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,

/xxx/index.action,或者/xxx/yyy/index.action

namespace最好也用模块来进行命名

5、11_尚学堂马士兵_Struts2_Struts2_Action.avi

(1)struts1 与struts2的一个重要区别:在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访

问都会创建一个Action对象,所以struts2不会有线程安全问题的发生

(2)<result>标签如果没有指定name属性默认返回值为success

(3)<action>标签中的class值如果没有配置相应的类,它会调用struts默认的一个处理类的execute()方法.

(4)实现struts的处理类的时候不要自己随便写类然后定义execute()方法,也不要实现Action类而要从ActionSupport类继承,可

以直接使用它为我们定义好的方法.

6、12_尚学堂马士兵_Struts2_Struts2_Path_路径问题.avi

(1)struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。

虽然可以用redirect方式解决,但redirect方式并非必要。

解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)

或者使用myeclipse经常用的,指定basePath

(2)request.getContextPath()得到项目的名字,一般用来解决路径问题 如果项目为根目录,则得到一个"",即空的字条串。

request.getscheme()返回的协议名称.默认是http

request.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhost

request.getServerPort()获取服务的端口号

7、13_尚学堂马士兵_Struts2_Struts2_ActionMethod_DMI_动态方法调用.avi

Action执行的时候并不一定要执行execute方法<br />

可以在配置文件中配置Action的时候用method=来指定执行哪个方法

也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />

<a href="<%=context %>/user/userAdd">添加用户</a>

<br />

<a href="<%=context %>/user/user!add">添加用户</a>

<br />

前者会产生太多的action,所以不推荐使用

配置文件:

<package name="user" extends="struts-default" namespace="/user">

<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">

<result>/user_add_success.jsp</result>

</action>

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">

<result>/user_add_success.jsp</result>

</action>

</package>

8、14_尚学堂马士兵_Struts2_Struts2_ActionWildcard_通配符配置.avi

主要学习通配符的使用 通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则

<package name="actions" extends="struts-default" namespace="/actions">

<action name="Student_add"></action>

<action name="Student_*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">

<result>/Student_{1}_success.jsp</result>

</action>

<!-- 更简便的配置法 -->

<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">

<result>/{1}_{2}_success.jsp</result>

</action>

</package>

说明:

(1){1}代表name="Student*"后面第一个'*',同理{2}代表第二个'*'

(2).如果action之间有重复配置,struts2会匹配最精确的action。如果通配符配置之间有重复,则看前后配置顺序

9、 15_尚学堂马士兵_Struts2_Struts2_用Action的属性接收参数.avi

在继承ActionSupport的类中定义要接受的参数,参数的名称与Action所传的名称无关在struts2内部调用的是属性的set方法

,所以setxxx()的名字一定要与Action后面所传的值是一样的。

10、16_尚学堂马士兵_Struts2_Struts2_用DomainModel接收参数.avi

如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象例如:

private User user (set get 方法)在调用Action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递

。(最常用的方式)

11、17_尚学堂马士兵_Struts2_Struts2_用ModelDriven接收参数.avi

继承ActionSupport类的处理类必须同时实现ModelDriven<Object>(实现getModel())在传值的时候使用user/user!add?

name=bbb进入处理类的时候会调用getModel()方法返回User对象并且把传过来的值set到里面,注意:此时private User user =

new User() 不能只定义,要同时实现这样getModel()才能拿到user对象。

12、18_尚学堂马士兵_Struts2_Struts2_2.1.6版本的中文问题.avi

在配置文件中加入:

<constant name="struts.i18n.encoding" value="GBK"/> 按照文档说明加入此句可解决中文乱码但是不行这是2.1.6的一个bug,

会在下一个版本中修复 如何解决呢:在web.xml中:

<filter-name>struts2</filter-name>

<!--<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-->

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

把过滤器的版本改成老版本的即可解决该问题!

13、19_尚学堂马士兵_Struts2_简单数据验证_1.avi

使用addFieldError方法和s:fieldError标签简单处理数据校验

public String add() {

if(name == null || !name.equals("admin")) {

this.addFieldError("name", "name is error");

this.addFieldError("name", "name is too long");

return ERROR;

}

return SUCCESS;

}

在页面中显示错误信息:

<!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->

<s:fielderrorfieldName="name" theme="simple"/>

<!-- 从存储错误信息的Map中拿数据 -->

<s:property value="errors.name[1]"/>

<!-- 显示详细的栈信息-->

<s:debug></s:debug>

Value stack的使用

14、21_尚学堂马士兵_Struts2_访问Web元素_1.avi

Request ,session,application context,httprequest

通过js控制一个form可以多个提交action

Context可以理解为环境,运行时候的所有环境的集合

Actioncontext的上下文环境的记录,记录了action的所有的环境东西;

不同的JSP页面元素的访问;

不同JSP页面的参数的访问;

注意:web.xml中关于struts的配置一定要采用2.1的,2.0的会取不到这是一个bug

(1)通过ActionContext对象取得Map类型的request, session, application HttpServletRequest,

HttpSerletSessionServletContetext:

public class LoginAction1 extends ActionSupport {

private Map request;

private Map session;

private Map application;

//访问此方法,取得相应的对象但是是Map类型

public LoginAction1() {

request = (Map)ActionContext.getContext().get("request");

session = ActionContext.getContext().getSession();

application = ActionContext.getContext().getApplication();

}

//在Map类型的对象中存入相应的值

public String execute() {

request.put("r1", "r1");

session.put("s1", "s1");

application.put("a1", "a1");

return SUCCESS;

}

}

//在页面中通过标签取得存入的数据二种方法(通过标签, 通过原始方式):

<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %><br />

<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %><br />

<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %><br />

<s:property value="#attr.a1"/><br />

<s:property value="#attr.s1"/><br />

<s:property value="#attr.r1"/><br />

<s:debug></s:debug>

<br />

我们存入Map中的数据居然可以在request,等对象中得到,那么在struts内部他是将Map中的数据全部复制到了request,session

等对象中的 #attr ,可以取得所有的属性,但是不推荐使用,为了防止同名的情况,造成无法区别。

(2)通过实现RequestAware,SessionAware, ApplicationAware 接口获取(最常用 和重要的一种)

private Map<String, Object> request;

private Map<String, Object> session;

private Map<String, Object> application;

//DI dependency injection

//IoC inverse of control,自己不初始化对象,交给spring进行处理new的方式

public String execute() {

request.put("r1", "r1");

session.put("s1", "s1");

application.put("a1", "a1");

return SUCCESS;

}

@Override

public void setRequest(Map<String, Object> request) {

this.request = request;

}

@Override

public void setSession(Map<String, Object> session) {

this.session = session;

}

@Override

public void setApplication(Map<String, Object> application) {

this.application = application;

}

(3)通过ServletActionContext()取得真实的相应的对象

privateHttpServletRequest request;

privateHttpSession session;

privateServletContext application;

public LoginAction3() {

request = ServletActionContext.getRequest();

session = request.getSession();

application = session.getServletContext();

}

public String execute() {

request.setAttribute("r1", "r1");

session.setAttribute("s1", "s1");

application.setAttribute("a1", "a1");

return SUCCESS;

}

(4)通过实现ServletRequestAware接口获得相应的对象

privateHttpServletRequest request;

privateHttpSession session;

privateServletContext application;

public String execute() {

request.setAttribute("r1", "r1");

session.setAttribute("s1", "s1");

application.setAttribute("a1", "a1");

return SUCCESS;

}

@Override

public void setServletRequest(HttpServletRequest request) {

this.request = request;

this.session = request.getSession();

this.application = session.getServletContext();

}

Request在value stack中使用,而application直接存放在数据库中访问,而对于session最常用

修改了action后需要重新部署,其他的jsp和struts配置文件不需要重启

15、23_尚学堂马士兵_Struts2_模块包含

<struts>

<constant name="struts.devMode" value="true" />

<include file="login.xml" />

</struts>

可以将别的写好的配置文件直接包含到struts得配置文件中,方便多人开发避免不必要的配置文件冲突.

login.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="login" extends="struts-default" namespace="/login">

<action name="login*" class="com.bjsxt.struts2.user.action.LoginAction{1}">

<result>/user_login_success.jsp</result>

</action>

</package>

</struts>

16、24_尚学堂马士兵_Struts2_默认Action

<package name="default" namespace="/" extends="struts-default">

<!-- 当配置文件中没有用户要访问的Aciton的时候,会调用<default-action-ref 所定义的Action --处理错误页面 -->

<default-action-ref name="index"></default-action-ref>

<action name="index">

<result>/default.jsp</result>

</action>

</package>

17、27_尚学堂马士兵_Struts2_结果类型_result_type_1

ResultType的最常用的几种配置:(四种配置分别代表了四种不同的跳转方式)

<package name="resultTypes" namespace="/r" extends="struts-default">

<action name="r1">

<!--type不写默认的为dispatcher:用服务器跳转跳转到结果页面--只能跳转到页面,不能跳转到Action -->

<result type="dispatcher">/r1.jsp</result>

</action>

<action name="r2">

<!--客户端跳转的方式跳转到结果页面 只能跳转到页面,不能跳转到Action -->

<result type="redirect">/r2.jsp</result>

</action>

<action name="r3">

<!--服务器跳转的方式跳转到Action -->

<result type="chain">r1</result>

</action>

<action name="r4">

<!--客户端跳转的方式跳转到Action -->

<result type="redirectAction">r2</result>

</action>

<!--当要跳转的Action在别的包下的时候 应该这样写-->

<action name="r5">

<result type="china">

<parma name="actionName">dashboard</param>

<parma name="namespace">/sesure</param>

</result>

</action>

18、30_尚学堂马士兵_Struts2_Global_Results_全局结果集

<package name="user" namespace="/user" extends="struts-default">

<!-- 配置全局的结果集:当返回的result没有配置的时候会执行全局结果集的配置-->

<global-results>

<result name="mainpage">/main.jsp</result>

</global-results>

<action name="index">

<result>/index.jsp</result>

</action>

</package>

<!--关键字extends的使用:我想在下面的这个配置包中使用上面那个包中的结果集,那么可以使用extends关键字继承上一个包

<package name="admin" namespace="/admin" extends="user">

<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">

<result>/admin.jsp</result>

</action>

</package>

17、31_尚学堂马士兵_Struts2_动态结果集_dynamic_result

可以在strtus.xml文件中动态的指定返回的结果集。

public class UserAction extends ActionSupport {

privateint type;

private String r;

public String getR() {

return r;

}

public void setR(String r) {

this.r = r;

}

publicintgetType() {

return type;

}

public void setType(int type) {

this.type = type;

}

@Override

public String execute() throws Exception {

if(type == 1) r="/user_success.jsp";

else if (type == 2) r="/user_error.jsp";

return "success";

}

}

struts.xml文件中的配置:

<package name="user" namespace="/user" extends="struts-default">

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">

<!--可以用${属性名}的方式取得Action中的属性,在服务器端判断好相应的跳转路径然后存到变量里 然后再struts.xml文件中用

这种方式取出来,可以极大的增加配置文件的灵活性 -->

<result>${r}</result>

</action>

</package>

18、32_尚学堂马士兵_Struts2_带参数的结果集

访问链接格式:<a href="user/user?type=1">传参数</a>

public class UserAction extends ActionSupport {

privateint type;

publicintgetType() {

return type;

}

public void setType(int type) {

this.type = type;

}

@Override

public String execute() throws Exception {

return "success";

}

}

当从一个Action跳转到另一个Action的时候,如果需要传值并且是服务器端的跳转,没有必要再struts.xml文件result的跳

转路径中进行传值操作,因为多个服务器端的跳转,共享的是同一个值栈,可以直接取到,但是如果是客户端的跳转(redirect)的

方式进行跳转则需要进行如下的配置:

<package name="user" namespace="/user" extends="struts-default">

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">

<!-- 用${}的方式是从值栈取值,注意:不是El表达式 -->

<result type="redirect">/user_success.jsp?t=${type}</result>

</action>

</package>

但是如果在jsp页面取出传输的值用<s:property value="t"/>是取不到的,因为这种方式是在值栈里取值而我们跳转道德是一个

jsp页面不是一个Action所以值栈为空,但是我们可以在ActionContext中进行取值:<s:property value="#parameters.t"/>

19、36_尚学堂马士兵_Struts2_OGNL_1

在访问Actoin向Action进行传值的时候

http:www.xxxxx/ognl.action?username=u&password=p;

private String username(set get 方法)

private String password(set get 方法)

如果用这种方式进行传值,那么在jsp页面中可以用<s:property value="username"/>进行访问值栈中的内容,没有任何问题但是

如果:

http:www.xxxxx/ognl.action?username=u&password=p;

private User user;(set get)方法,使用<s:property value="user"/>依然访问不到,因为如果采用dominModel的方式进行传值

,必须:http:www.xxxxx/ognl.action?user.username=u&user.password=p;这样 Struts会在Action中帮助我们new一个User对象

,然后把值放进去,但是必须要有User空的构造方法。如果依然使用http:www.xxxxx/ognl.action?username=u&password=p;的方

式进行传值,那么在Action中必须手动的初始化User对象,Private User user = new User();这样同样可以访问的到。

20、37_尚学堂马士兵_Struts2_OGNL_2

Ognl:Object graph Navigation Language(对象图导航语言):首先看一下下面三个类之间的关系:

public class OgnlAsction extends ActionSupport {

private Cat cat;(set get 方法)

public String m() {

return "你好";

}

}

public class Cat {

private Dog friend;(set get 方法)

}

public Dog {

private String name;(set get 方法)

}

在OgnlAction中包含Cat,而在Cat中包含Dog的对象friend,那么现在我想访问OgnlAction的时候,给friend肤质,我们应该这么写

http:www.xxxx/ognl.action?cat.friend.name=aaa; 用点进行导航,所以叫做"对象图导航语言"。

21、39_尚学堂马士兵_Struts2_OGNL_4

已知以下三个类中的属性和方法:

public class OgnlAsction extends ActionSupport {

private Cat cat;(set get 方法)

private String password;(set get 方法)

List<User> users = new ArrayList<User>();(set get 方法)

}

public class Cat {

private Dog friend;(set get 方法)

private String miaomiao() {

return "miaomiao";

}

}

public Dog {

private String name;(set get 方法)

}

public class S {

public static String STR = "STATIC STRING";

public static String s() {

return "static method";

}

}

(1)访问值栈中对象的普通方法:<s:property value="password.length()"/>

(2)访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" />

(3)访问值栈中的Action的普通属性<s:property value="username"/>

(4)访问值栈中对象的普通属性<s:property value="user.age" />

(5)访问值栈中对象的普通属性<s:property value="cat.friend.name" />

(6)访问值栈中Action的普通方法<s:property value="m()" />

<!--要想访问静态方法,必须在struts.xml文件中加入如下配置才可以 -->

<constant name="struts.ognl.allowStaticMethodAccess"value="true"/>

(7)访问静态方法<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>

(8)访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>

(9)访问Math类的静态方法:<s:property value="@@max(2,3)" />(不常用)

(10)访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User()"

(11)访问List:<s:property value="users"/>

(12)访问List中某个元素:<s:property value="users[1]"/>

<!--把users中的每一个元素User取出来,然后取他们的age属性连接成的字符串-->

(13)访问List中元素某个属性的集合:<s:property value="users.{age}"/>

(14)访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users

[0].age"/>

(15)访问Set:<s:property value="dogs"/>

<!--下面这样访问set中的某个元素是访问不到的,因为set是没有顺序的 -->

(16)访问Set中某个元素:<s:property value="dogs[1]"/>

(17)访问Map:<s:property value="dogMap"/>

(18)访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> |

<s:property value="dogMap[\"dog101\"]"/>

(19)访问Map中所有的key:<s:property value="dogMap.keys"/>

(20)访问Map中所有的value:<s:property value="dogMap.values"/>

<!--在ognl中他会把size方法看成属性,所以可以不加括号,直接访问 -->

(21)访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>

<!-- ?#指的是过滤:取出users中的每个age==1的元素 [0]是取第一个,不加会全部取出来

(22)投影(过滤):<s:property value="users.{?#this.age==1}[0]"/>

<!-- ^#:开头取出满足条件的开头的那一个 -->

(23)投影:<s:property value="users.{^#this.age>1}.{age}"/>

<!-- $#:开头取出满足条件的结尾的那一个 -->

(24)投影:<s:property value="users.{$#this.age>1}.{age}"/>

<!--判断 -->

(25)投影:<s:property value="users.{$#this.age>1}.{age} == null"/>

(24)投影:<s:property value="users.{$#this.age>1}.{age}"/>

<!-- value="[1]访问值栈中从上到下的第几个元素,而[0]指的是值栈中从开始到结尾的所有的对象,得到的是一个集合"

[0].username:访问值栈中所有元素的username属性,如果没有此属性会依次往下找其他的Action(从一个action跳转到另一个

action的时候值栈中会有两个action) -->

(25)[]:<s:property value="[0].username"/>

22、44_尚学堂马士兵_Struts2_Struts标签_1

(1)property: <s:property value="username"/>

(2)property 取值为字符串: <s:property value="'username'"/>

<!--如果取到admin的值,就是admin的值否则就是default所定义的默认值 -->

(3)property 设定默认值: <s:property value="admin" default="管理员"/>

<!-- value可以直接写html标签,escape默认为true,会原样不变显示出来,false将把html标签转化为浏览器可以识别的标签,显

示相应的效果 -->

(4)property 设定HTML: <s:property value="'<hr/>'" escape="false"/>

<s:property>有三个属性,value ,escapeHtml,default,其中的value是ognl表达式

<s:set>设置变量,value ,var ,scope三个属性,其中的value是ognl表达式

<s:bean>两个属性,name,var; 都是字符串 ,执行开始new一个bean当为</s:bean>时,从栈顶移除,将不能使用;

<s:param>两个属性,name,value;其中的value是ognl表达式;

<s:include>包含文件,最好不用,一个属性value字符串;

Ognl表达式:$用于struts2中的传参和i18n配置文件中;

#用于action context中取值;

%{}用于将原来的字符串属性转变成ognl,如果是ognl表达式属性就将该表达式转变成字符串

<s:fielderror>取得的值是不规则的值,如果取到正确的值?

控制标签---两个(<s:if><s:elseif><s:else> 和<s:iterator>

<s:if>这个标签就是使用了上面所说的%{}其中括号中可以使ognl表达式,也可以是字符串

<s:iterator>标签,其中的value是ognl表达式,其中的status是个boolean,其中可以设置var属性是个字符串,是每次循环的那个变量相当于;

遍历集合:其中value直接可以访问,不用使用#

Status中count个数;

Status 中的index表示索引;

Status中的even表示是否是偶数;

Staus中的odd表示是否是奇数;

Status中的first表示是否是第一个元素;

Status中的last表示是否是最后一个元素;

定义map对象的时候,必须要将加上#,这个是一个疑惑,不必纠结;

获得map中的对象,.key ,.value获取相关的值;

<s:subset>表示获取其中的子集合;

其中的source表示其中的list或者是map对象,其中的count表示获取的子集合的大小,start表示开始的元素大小;

标签总结:

<s:property><s:set><s:bean><s:param><s:include>主要是三个标签;

其中只有一个<s:bean>使用到了name属性

23、45_BBS项目相关介绍分析—系统数据库及其文件命名规则

Model层和service层的含义

Model:代表数据库访问层

访问action中的普通

数据表命名:大小写;

文件的命名对应了action的使用,所以要注意;

24、46_BBS项目相关介绍分析—后台系统模板,前台程序模板的来源方式

前台:直接从网站另存为方式;

后台:采用一些快捷的jquery ui模板,例如extjs,easyui ,jquery ui,推荐使用easyui,方便快捷;

25、47_BBS项目相关介绍分析—项目框架

配置相关的页面跳转使用;

数据库的建立-----

26、48_BBS项目相关介绍分析—model层和service层的使用

Model层,与数据库表对应的一层;

Service层,业务处理数据层,增删改查业务需要处理逻辑;

数据库连接层;建立数据库连接的方式;

27、49_声明式异常处理

各个方法调用的时候不晓得异常情况。

Struts2处理异常

各个类中进行处理异常后,加上一句throw(e);

请不要进行try catch

<Exception-mapping

Result页面

一个action的异常处理让所有的action都可以使用处理。

<global-result>

从该包中找到对应的exception处理,如果没有就找到父类的包中是否有

拦截器的处理的使用,

28、50_默认的action

主要是查看帮助文档,默认的action中class属性不起作用。

如果要使用class属性处理,可以采用result type=”redirectaction”

或者是采用web.xml中使用处理,设置其中的welcome中的action名称

29、51_i18n程序的处理

资源文件插件才能使用中文转化为ascii;

<s:property 直接条用gettext方法,我们以前的ognl表达式中说了只能在action直接调用action中的方法。

--action级别的国际化

--package级别和application级别的国际化;用的比较少;

一般采用application级别的,

在struts2中配置i18n

---处理资源文件中的中文参数。

--动态语言切换

设置一个action中传入一个参数,则会在value stack中传入一个locale为对应的语言。

对应session中也将引入该locale参数;

30、52_拦截器的运用




本文转自hcy's workbench博客园博客,原文链接:http://www.cnblogs.com/alterhu/archive/2012/05/14/2498812.html,如需转载请自行联系原作者。
目录
相关文章
|
24天前
|
小程序 JavaScript 数据安全/隐私保护
分享全栈开发医疗小程序 -带源码课件(课件无解压密码),自行速度保存
看到好多坛友都在求SpringBoot2.X + Vue + UniAPP,全栈开发医疗小程序 - 带源码课件,我看了一下,要么链接过期,要么课件有压缩密码。特意整理了一份分享给大家,个人认为还是比较全面的。希望对大家有所帮助!课程仅供大家学习交流使用!
31 1
分享全栈开发医疗小程序 -带源码课件(课件无解压密码),自行速度保存
|
1月前
|
存储 前端开发 Java
[java后端研发]——文件上传与下载(2种方式)
[java后端研发]——文件上传与下载(2种方式)
|
4月前
|
监控 安全 Java
腾讯T4大牛整理的SpringBoot文档,覆盖你认知中的所有操作
SpringBoot目前的使用已经很普遍了,实际的项目中,我们需要集成各种的插件支持,不仅如此,还有很多可能我们平时不知道,但是很方便的操作。pdf里面的东西还是比较全面的。
|
4月前
|
SpringCloudAlibaba Java Nacos
前阿里P8甩我一份内部SpringCloud笔记手册,真香
SpringCloud Alibaba 因配置灵活、迭代高速、兼容性强,近几年在受到国内不少开发者的广泛关注。其中,Sentinel 作为服务治理开源组件相当出彩,可以帮助解决很多难题,比如:秒杀限流,消息削峰填谷,集群流量控制,实时熔断等。而作为国内的Spring爱好者,最最苦恼的莫过于操作性强的进阶干货太少了!
|
4月前
|
SQL 安全 Java
阿里大牛1个月肝出一份35万字Security实战笔记,GitHub标星47k+
很多时候,一个系统的安全性完全取决于系统开发人员的安全意识。例如,在我们从未听过SQL注入时,如何意识到要对SQL注入做防护?关于Web系统安全的攻击方式非常多,诸如XSS、CSRF等,未来还会暴露出更多的攻击方式,我们只有在充分了解其攻击原理后,才能提出完善而有效的防护策略。在笔者看来,学习Spring Security并非局限于降低Java应用的安全开发成本,通过Spring Security了解常见的安全攻击手段以及对应的防护方法也尤为重要,这些是脱离具体开发语言而存在的。
阿里大牛1个月肝出一份35万字Security实战笔记,GitHub标星47k+
|
5月前
|
消息中间件 设计模式 分布式计算
大厂招聘重点全在这!GitHub置顶Java基础-高级面试库+自学路线
最近几年经常会听见这样一种声音:“程序员是吃青春饭的,年龄一大就不吃香了”,在当下这种互联网产业增速放缓,甚至隐约展现出疲态的时刻,此类言论就很有市场。
|
7月前
|
安全 NoSQL Java
阿里内部技术专家撰写434页SpringBoot笔记,被恶意流传,已开源
什么是Spring Boot?有什么作用? Spring Boot是由Pivotal团队提供的全新框架,设计目的是用来简化新Spring应用的初始搭建以及开发过程。目前SpringBoot已然成为中小企业构建web应用系统的标准工具,堪称快速开发神器。尤其是随着微服务的全面普及,SpringBoot更加成了服务化开发事实上的行业标准。
|
7月前
|
开发框架 前端开发 Java
太顶了!阿里P8整理出了这份444页深入浅出SpringBoot2.X大神笔记
为什么要说SpringBoot? SpringBoot作为一个被市场高度关注的微服务开发框架,版本迭代十分频繁。 Spring和SpringBoot技术的使用和涉及面十分广泛,一些技术博大精深,版本更替也十分频繁。
|
8月前
|
XML Java Maven
公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档
我们刚开始学习 JavaWeb 的时候,使用 Servlet/JSP 做开发,一个接口搞一个 Servlet ,很头大,后来我们通过隐藏域或者反射等方式,可以减少 Servlet 的创建,但是依然不方便,再后来,我们引入Struts2/SpringMVC 这一类的框架,来简化我们的开发 ,和 Servlet/JSP 相比,引入框架之后,生产力确实提高了不少,但是用久了,又发现了新的问题,即配置繁琐易出错,要做一个新项目,先搭建环境,环境搭建来搭建去,就是那几行配置,不同的项目,可能就是包不同,其他大部分的配置都是一样的,Java 总是被人诟病配置繁琐代码量巨大,这就是其中一个表现。那
|
8月前
|
Java Docker 容器
这份神仙版的SpringBoot学习文档,简直把所有操作都给写出来了
2023年秋招了,各路码友们都开始磨拳擦脚,背面试题、知识点。小编最近得一良友赠送了一份关于SpringBoot的学习笔记,简直不要好用,理论解析言简意赅,每一步操作都有图片展示。这么好的东西肯定不能私藏,我现在将这份笔记赠送给大家,祝大家前程似锦,Offer不断!

相关实验场景

更多