有什么网站可以免费看电影,如何安装网站程序,简洁ppt模板下载免费,苏州营销型网站建设方法首先我们先来直接配置#xff0c;然后再来讲原理#xff1a; 第一步#xff1a;jar包的引入#xff1a; 我们可以到struts2的官网上下载#xff1a; http://struts.apache.org/download.cgi#struts2513 然后解压将里面的app文件夹下的示例war文件解压#xff0c;将里面的…首先我们先来直接配置然后再来讲原理 第一步jar包的引入 我们可以到struts2的官网上下载 http://struts.apache.org/download.cgi#struts2513 然后解压将里面的app文件夹下的示例war文件解压将里面的struts.xml复制到我们新创建的src目录下特别说一下struts2最新的Struts 2.5.13版本压缩包里面没有示例的blank示例文件我是在2.3.34里面获得的 配置文件大概是这样的 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE struts PUBLIC -//Apache Software Foundation//DTD Struts Configuration 2.1//EN http://struts.apache.org/dtds/struts-2.1.dtd
strutsconstant namestruts.enable.DynamicMethodInvocation valuefalse /constant namestruts.devMode valuetrue /package namedefault namespace/ extendsstruts-defaultaction namehelloresult/Hello.jsp/result/action/package
/struts 以上的配置文件是经过我的修改的所以比较简洁因为我们第一步实现action并没有那么复杂。 第二步我们需要在web.xml中配置过滤器将struts组件插入进来。 配置文件大概是这样 ?xml version1.0 encodingUTF-8?
web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://java.sun.com/xml/ns/javaee xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd idWebApp_ID version3.0display-nametestStruts2/display-namewelcome-file-listwelcome-fileindex.html/welcome-filewelcome-fileindex.htm/welcome-filewelcome-fileindex.jsp/welcome-filewelcome-filedefault.html/welcome-filewelcome-filedefault.htm/welcome-filewelcome-filedefault.jsp/welcome-file/welcome-file-listfilterfilter-namestruts2/filter-namefilter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class/filterfilter-mappingfilter-namestruts2/filter-nameurl-pattern/*/url-pattern/filter-mapping
/web-app 然后我们在根目录下创建一个jsp文件 % page languagejava importjava.util.* pageEncodingUTF-8%
%
String path request.getContextPath();
String basePath request.getScheme()://request.getServerName():request.getServerPort()path/;
%!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
htmlheadbase href%basePath%titleMy JSP index.jsp starting page/titlemeta http-equivpragma contentno-cachemeta http-equivcache-control contentno-cachemeta http-equivexpires content0 meta http-equivkeywords contentkeyword1,keyword2,keyword3meta http-equivdescription contentThis is my page!--link relstylesheet typetext/css hrefstyles.css--/headbodyhellobr/body
/html 里面不需要太多东西我们只是做一个简单的测试。 然后我们将项目部署到tomcat中启动。 然后用浏览器访问 http://localhost:8080/testStruts2/hello 浏览器就会跳转到我们写好的Hello.jsp页面。 我们接着讲原理 首先浏览器发出一个url这个url首先发送到服务器也就是我们的tomcat发到tomcat过后将交给web.xml然后进入过滤器通过过滤器将这个请求发送给StrutsPrepareAndExecuteFilter来处理 StrutsPrepareAndExecuteFilter调用主配置文件struts.xml中的namespace看是否与namespace吻合找到与之吻合的package然后找对应的action的name然后转到对应的页面。 其实上面过程还省略了一些过程 就是一个请求到了action的name的时候并不会直接转到我们的页面而是会转到action对应的类 上面的struts省略了这一步但是struts2帮我们默认执行了这一个过程如果我们补充这个过程的话应该这样 action namehello classtestStruts2.HelloAction package testStruts2;import com.opensymphony.xwork2.ActionSupport;public class HelloAction extends ActionSupport{public String execute() {return SUCCESS;}
} 在struts2的主配置文件action中添加一个class“”并在项目的testStruts2中添加一个action类这个action类可以有三种方法来写但是都要包含execute方法。 我们给出剩下的两种action类书写方式 package testStruts2;import com.opensymphony.xwork2.ActionSupport;public class HelloAction{public String execute() {return success;}
} package testStruts2;import com.opensymphony.xwork2.ActionSupport;public class HelloAction implements Action{public String execute() {return SUCCESS;}
} 以上的两种方法一个是不继承和实现任何方法但是包含一个execute方法返回一个success字符串另一个实现Action方法返回SUCCESS。 Action里面已经封装了一些变量所以实现这个接口的类可以直接返回SUCCESS同时我们还要知道ActionSupport也实现了Action并且里面还封装了大量的方法这个以后我们将慢慢用到。 以上三种action书写方式建议使用第一种因为我们以后将要经常使用到ActionSupport里面封装的方法。 经过上面这个的Action返回一个success然后StrutsPrepareAndExecuteFilter将action里面的result里的页面返回给浏览器。 如果留意的同学还会发现我们从官网下载下来的blank范例里面action里面还有些其他的属性对就是method。 动态方法调用 定义一个action并不一定实现Action接口同时也可以不执行execute方法我们只要将action里面的method属性改为要执行的方法就行就像这样 action namehello classtestStruts2.HelloAction methodADD 同时我们action里面的方法也要改为ADD但是返回值类型一定要为String package testStruts2;
public class HelloAction {public String ADD() {return success;}
} 这样对于不同的请求我们可以根据需要在同一个Action类中用不同的方法处理。 这样可以减少创建Action类并且安全但是也会造成一个Action类太过庞杂。 动态方法调用有三种方式上面的算式一种。 继续我们来说第二种 用“”叹号方式不推荐使用 这种方法怎么使用呢 action namehelloadd classtestStruts2.HelloAction result/Hello.jsp/result
/action 就是这样理论上我们再Action类中含有execute方法不会产生什么影响但是如果我们将Action类中的方法改为String Add呢 就会报错所以就用到可了我们的url地址应该为 http://localhost:8080/testStruts2/hello/helloadd!ADD 这样就会找到ADD方法了。 但是还要注意一点的是我们要将动态方法调用打开 constant namestruts.enable.DynamicMethodInvocation valuetrue / 这里默认是关闭的我们将它改为true就行了。 第三种就是通配符配置了 首先我们需要将上面的DMI改为false不改也可以运行但是建议改。 action namehello_* classtestStruts2.HelloAction method{1}result/Hello_{1}.jsp/result/action 然后就是这样用*代替未知的url 这里的{1}表示第一个 * 代表的内容 使用通配符可能有好几个 * 我们可以根据*的顺序用{2}{3}…依次表示 http://localhost:8080/testStruts2/hello/hello_ADD.action用这个url来访问我们的ADD方法 当我们需要其他DELETE删除的时候 只需要输入http://localhost:8080/testStruts2/hello/hello_DELETE.action 并在Action类里面添加DELETE方法和添加响应的Hello_DELETE.jsp页面。 使用通配符简化了我们好多的配置原来需要在配置文件中配置好多个action现在只需要用通配符就可以解决这些只需要添加响应的Action类方法和jsp页面就行了。 action name*_* classtestStruts2.{1}HelloAction result /{1}_{2}_hello.jsp/result
/action 上面的是两个通配符的范例如果请求是这样 http://localhost:8080/testStruts2/hello/hello_DELETE.action 它就能够根据{1}找到对应的Action类根据{2}找到对应的方法。 是不是很简便?(这样的做法叫做约定优于配置) action接收参数 我们怎么样用struts接受客户端发过来的参数呢?下面列举四种方法 ①属性参数输入 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE struts PUBLIC -//Apache Software Foundation//DTD Struts Configuration 2.1//EN http://struts.apache.org/dtds/struts-2.1.dtd
strutsconstant namestruts.enable.DynamicMethodInvocation valuefalse /constant namestruts.devMode valuetrue /package namedefault namespace/ extendsstruts-defaultaction nameuser classtestStruts1.userActionresult/user.jsp/result/action/package
/struts 上面是配置文件没什么好说的和之前大同小异。 我们接下来看看Action类 package testStruts1;import com.opensymphony.xwork2.ActionSupport;public class userAction extends ActionSupport{String username;public userAction() {}public userAction(String username) {super();this.username username;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String execute() {System.out.println(username);return SUCCESS;}
} 首先这个类要符合javabean的命名规则我们再Action类中添加了一个username属性并含有它的set get方法并在execute里面将接收到的username输出到控制台来证实实验。 当我们将项目部署到服务器上后在浏览器中输入一下URl http://localhost:8080/testStruts1/user.action?usernameaa 控制台便会将接受到的username参数输出。 我们可以看到上面使用Action类的属性来接收参数的struts通过我们给出的set get 方法帮助我们完成赋值。 ②同样我们也可以定义一个实体类来来接收这些信息官方叫DomainModel 例如 这个是我们提交的信息 form actionlogin methodpost用户名input typetext nameuser.usernamebr密码input typepassword nameuser.passwordbrinput typesubmit value登录/form
/*input里面一定要使用user.username和user.password和实体类对应或者使用struts2提供的标签否则会出错不要问我是怎么知道的 哭脸.jpg*/ 这个是实体类 package entity;public class User {String username;String password;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}
} package testStruts1;import com.opensymphony.xwork2.ActionSupport;import entity.User;public class userAction extends ActionSupport{User user;//不需要new对象struts2帮我们完成了public User getUser() {return user;}public void setUser(User user) {this.user user;}public String execute() {if(user.getUsername().equals(username)user.getPassword().equals(password)) {return SUCCESS;}return ERROR;}
} /*struts.xml*/action namelogin classtestStruts1.userActionresult namesuccess/user.jsp/resultresult nameerror/error.jsp/result/action ③还有一种使用DTOdate transfer object数据传输对象来进行传输。 这种方式主要是应对提交的参数和我们的实体对象不匹配的状况 比如用户注册的时候会输入第二次密码来进行确认我们将接受两个密码所以在这个类中我们接收三个参数username passwordconfirmPassword。 然后在Action类的execute方法中使用DTO对象来对User对象进行赋值 User user new User();//这里就需要我们实例化了因为struts实例化的机会被下面的玩意抢了。DTO dto ;public String execute(){user.setUserName(dto.getUserName()); user.setUserPassword(dto.getUserPassword()); //后面再利用user实例来进行一系列的操作。
} 当然现在我们有更为先进的技术就是我们完全可以用js来在客户端确认是否相同然后将数据传输过来。 ④还有一种叫方法ModelDriven public class userAction extends ActionSupport implements ModelDrivenUser{User user new User();//这里需要自己new对象Overridepublic User getModel() {return user;}public void setUser(User user) {this.user user;}public User getModel() {return user;}public String execute() {if(user.getUsername().equals(username)user.getPassword().equals(password)) {return SUCCESS;}return ERROR;}
} 就是这样实现ModelDriven接口并实现getModel方法直接获得这个模型对象user。怎么实现这样的原理的呢 是通过一个缺省的拦截器ModelDrivenInterceptor这里面判断一个Action对象是否实现ModelDriven如果实现就返回这个User对象并将User对象push到valueStack中valueStack后边介绍。 版权声明本文为博主原创文章如需转载请表明出处。 https://blog.csdn.net/qq_39266910/article/details/78485739 转载于:https://www.cnblogs.com/chengshun/p/9772835.html