struts2怎么解决(struts2解决了什么问题)
本文目录
- struts2解决了什么问题
- Struts2中action的方法被执行两次,该怎么处理
- struts 2问题,如下图,怎么解决啊
- java struts2.json.JSONException怎么解决
- 您好,struts2中页面抛出异常时后台控制台无法显示错误堆栈,你是怎么解决的啊
- Struts2 报这样的错误,怎么解决
struts2解决了什么问题
Struts框架主要解决的问题是对MVC设计模式进行了封装。使其可以方便的使用。 Struts 2是Struts的下一代产品。是在 struts 和WebWork的技术基础上进行了合并,全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因为Struts 2和Struts 1有着太大的变化,但是相对于WebWork,Struts 2只有很小的变化。 Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与Servlet API分离。浏览器发送一个请求。核心控制器FilterDispatcher根据请求决定调用合适的Action。WebWork的拦截器链自动对请求应用通用功能,如验证等。回调Action的execute方法,该execute方法根据请求的参数来执行一定的操作。Action的execute方法处理结果信息将被输出到浏览器中,支持多种形式的视图。 在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。线程模型方面:Struts1的Action工作在单例模式,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例。没有线程安全方面的问题。Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph Notation Language)。绑定值到视图技术:Struts1使用标准的JSP,Struts2使用“ValueStack”技术。类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。数据校验:Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。Action执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的声明周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的声明周期。 从某种程度上看,Struts2是从WebWork2上升级得到的。甚至Apache的官方文档也讲:WebWork2到Struts2是平滑的过渡。我们甚至也可以说Struts2就是WebWork2.3而已。在很多方面Struts仅仅是改变了WebWork下的名称。
Struts2中action的方法被执行两次,该怎么处理
Struts2中action的方法被执行两次; 解决办法: 1、点提交按钮的时候太快了导致提交出现两次重复的; (1)提交按钮至灰; (2)请求路径加上加上标志; 2、程序中出现两次调用这个action,检查调用方法;
struts 2问题,如下图,怎么解决啊
你这result返回type是dispatcher有点相当于forword方式跳转,因为url相对址址改变了,所以只有显示html但找不到相应的css文件。要想返回原来的index页面的话可以这样:《result name="success" type="redirect"》index.html《/result》或者其他几种type也可以试试,默认共有以下几种《result-types》 《result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/》 《result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/》 《result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/》***隐藏网址*** 《result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/》 《result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/》 《result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/》 《result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/》 《result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/》 《result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /》 《/result-types》
java struts2.json.JSONException怎么解决
Servlet的不写了,也就是how to use HttpRequest和HttpResponse。主要是在Struts2身上。以文章所描述的方法似乎总是差了那么点东西:可以不使用那么多配置吗?于是研究了些时间,可以这么玩:1)Eclipse引用Struts2的JSON plug-in和Convertion plug-in。2)struts.xml这么写:《?xml version="1.0" encoding="UTF-8"?》《!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"***隐藏网址***《struts》 《!-- 把它设置为开发模式,发布时要设置为false --》 《constant name="struts.devMode" value="true" /》 《!-- 设置在class被修改时是否热加载,发布时要设置为false --》 《constant name="struts.convention.classes.reload" value="true"/》 《!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method --》 《constant name="struts.enable.DynamicMethodInvocation" value="true" /》 《!-- 指定jsp文件所在的目录地址 --》 《constant name="struts.convention.result.path" value="/WEB-INF/content/" /》 《!-- 用于配置包名后缀。默认为action、actions、struts--》 《!-- 《constant name="struts.convention.package.locators" value="controller" /》 --》 《constant name="struts.convention.action.packages" value="com.my.controller"》《/constant》 《!-- 用于配置类名后缀,默认为Action,设置后,Struts2只会去找这种后缀名的类做映射 --》 《constant name="struts.convention.action.suffix" value="Controller"/》 《!-- 设置即使没有@Action注释,依然创建Action映射。默认值是false。因为Convention-Plugin是约定优于配置的风格, 可以不通过注解根据预先的定义就能访问相应Action中的方法 --》 《constant name="struts.convention.action.mapAllMatches" value="true"/》 《!-- 自定义jsp文件命名的分隔符 --》 《constant name="struts.convention.action.name.separator" value="-" /》 《!-- 国际化资源文件名称 --》 《constant name="struts.custom.i18n.resources" value="i18n" /》 《!-- 是否自动加载国际化资源文件 --》 《constant name="struts.i18n.reload" value="true" /》 《!-- 浏览器是否缓存静态内容 --》 《constant name="struts.serve.static.browserCache" value="false" /》 《!-- 上传文件大小限制设置 --》 《constant name="struts.multipart.maxSize" value="-1" /》 《!-- 主题,将值设置为simple,即不使用UI模板。这将不会生成额外的html标签 --》 《constant name="struts.ui.theme" value="simple" /》 《!-- 编码格式 --》 《constant name="struts.i18n.encoding" value="UTF-8" /》 《!-- 设置默认package --》 《constant name="struts.convention.default.parent.package" value="default"》《/constant》 《package name="default" namespace="/" extends="json-default"》 《interceptors》 《interceptor name="cacheInterceptor" class="com.my.interceptor.CacheInterceptor" /》 《interceptor-stack name="cacheStack"》 《interceptor-ref name="defaultStack"》《/interceptor-ref》 《interceptor-ref name="paramsPrepareParamsStack"》《/interceptor-ref》 《interceptor-ref name="cacheInterceptor"》《/interceptor-ref》 《/interceptor-stack》 《/interceptors》 《default-interceptor-ref name="cacheStack"》《/default-interceptor-ref》 《default-action-ref name="index" /》 《global-results》 《!-- 《result name="error"》/error.jsp《/result》 --》 《result name="json" type="json"》 《!-- 是否包括父类的属性输出,默认true. --》 《!-- 《param name="ignoreHierarchy"》false《/param》 --》 《!-- 是否输出null值的属性,默认false --》 《!-- 《param name="excludeNullProperties"》true《/param》 --》 《/result》 《/global-results》 《global-exception-mappings》 《exception-mapping exception="java.lang.Exception" result="error"/》 《/global-exception-mappings》 《/package》《/struts》上面有两个《param/》注释了,使用方法已经有写在里头,如果需要,可以加上或在类中加入@Results。关键点在于把《package /》中的 extends设置为json-default,以及在global-results中的这个json result。 3)加入一个UserControl.javapackage com.my.controller;import java.io.IOException;import java.util.ArrayList;import java.util.List;import net.sf.json.JSONObject;import com.my.beans.User;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class UserController extends ActionSupport { private User user = new User(); public User getUser() { return user; } public void setUser(User user) { this.user = user; } private String json; public String getJson() { return json; } public void setJson(String json) { this.json = json; } private List《User》 users = new ArrayList《User》(); public List《User》 getUsers() { return users; } public void setUsers(List《User》 users) { this.users = users; } @Override public String execute() throws Exception { return SUCCESS; } public String loadModel() throws IOException { System.out.println("json=" + getJson()); System.out.println("user=" + getUser().getUsername()); System.out.println("users=" + getUsers().size()); User userBean = new User(); userBean.setUsername("robin"); users.add(userBean); this.setJson(JSONObject.fromObject(userBean).toString()); return "json"; } }这里没有什么特别的东西,就是一些getter/setter,以及一个loadModel() action 4)JS对JSON的提交:var url = "user!loadModel";var params = { "json": "json string", "user.username" : "zhang", "users.username" : "zhang1", "users.password" : "1", "users.username" : "zhang2", "users.password" : "2",};$.post(url, params, function callback(data) { console.log(data)});这里是重点。可以看到这段JS里的params有:json/user.username/users.username其中:a) json对应的就是上页java中的getJson/setJson,这个东东列出来是可以用于在页面与服务器之间传递JSON字符串用的。如果你需要在action中输出或提交json的字符串,它有很大作用,直接到位。但是缺点是要自己去将对象转化为json string以及json string转化为对象。 b) user.username这样的写法可以在后台java中直接转化成了对象。user.username中的user就是java中的user object。 c) users.username这可以直接转化成后台java中的List《user》对象users。 可以看出,Struts2是可以完成将json直接转化成java object的。不过这样的写法,不是好的。因为这个JS的JSON只能称作是一个字符串拼接,不是一个JSON object还有一种方法,使用ModelDriven:package com.my.controller;import com.my.beans.User;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;@SuppressWarnings("serial")public class UserModelController extends ActionSupport implements ModelDriven《Object》 { private User user = new User(); @Override public Object getModel() { return user; } @Override public String execute() throws Exception { return SUCCESS; } public String load() { return "json"; }}使用ModelDriven,可以JS直接提交JSON了:var url = "user-model!load";var params = { "username": "zhang1", "password": "123456"};$.post(url, params, function callback(data) { console.log(data)});这个params才是真正的JSON object,它会被ModelDriven直接转成user model。但是:它似乎不能提交List object。至今写文时也没有找到在ModelDriven中可以提交JSON array to List的方法。如果需要提交复杂的JSON到服务器,如果你用的是Struts,使用第一种方法的json的getter/setter吧。
您好,struts2中页面抛出异常时后台控制台无法显示错误堆栈,你是怎么解决的啊
你 save了一个瞬态实例。也就是说,A和B有关联的话,其中A引用B.如果你持久化A对象的话,应该先将其关联的B对象先持久化才可以。否则就会出现transientObject Exception这个异常。一种解决办法是配置文件中加入cascade级联属性。会在你持久化A对象的时候自动将其关联对象持久化。
Struts2 报这样的错误,怎么解决
这个不是包冲突造成的,包冲突会报classnotfoundexception这个错误是由于没有导入struts核心包造成的,把包结构图给我看下。
更多文章:
access翻译成中文(access翻译为“进入“和别的同意思的单词的区别)
2024年7月22日 10:25
sql语句查询5到10的数据(VB 查询SQL数据库指定范围(5到10行)的数据)
2024年7月15日 15:55
asp源代码js统计(怎样用asp写代码来实现统计在线人数)
2024年7月28日 00:27
个人主页不显示朋友圈是怎么回事(微信里别人看不到自己的朋友圈是什么原因)
2024年7月8日 05:53
代码转化为流程图(大家大家,请问这个python代码怎么转换成流程图啊需要比较规范的!)
2024年8月6日 17:30
tower block(20号楼B座怎么翻译用block还是tower)
2023年9月13日 22:20
spring怎么读英文语音(在英语真的有化浊音吗 比如学生 student 本该读s tui den t 但是都是读s diu)
2024年7月12日 16:42
ulike蓝宝石冰点脱毛仪靠谱吗(整理关于Ulike,慕金,OSD这几款脱毛仪的测评)
2024年5月18日 17:14
result in什么意思(resultat与resultin区别)
2024年7月22日 07:19
python编程案例教程教材答案(python编程题!!!)
2024年9月4日 12:30