|
2012年4月20日
http://blog.csdn.net/code__code/article/details/53885510
1. 使用Spring Security管理用户身份认证、登录退出
2. 用户密码加密及验证
3. 采用数据库的方式实现Spring Security的remember-me功能
4. 获取登录用户信息。
5.使用Spring Security管理url和权限
摘要: // 自定义登录页面 http.csrf().disable().formLogin().loginPage("/login") //指定登录页的路径&n... 阅读全文
<bean id="jobDetail7"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<propertyname="targetObject" ref="billingBillTask"></property>
<propertyname="targetMethod" value="executeInternal" />
<propertyname="concurrent" value="false" />
</bean>
<beanid="billingBillTask"class="com.dangdang.tms.job.schedule.bms.BillingBillTask"/>
<beanid="cronTriggerBean7" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<propertyname="jobDetail" ref="jobDetail7"></property>
<propertyname="cronExpression" value="0/5 * * * * ?"></property>
</bean>
参考 http://blog.csdn.net/lkforce/article/details/51841890
为了解决一些比较费时且不是很紧要的任务,将此任务转为异步任务处理,提高前端操作体验。
spring 中 自带注解 @Async.
配置如下
applicationContext.xml 中 增加 task的引用
如上配置之后,只需要在 需要进行异步调用的方法前面增加 注解就可以了。
@Async
public void updateOrderBillItemPQty(String deptId, String orderNo, Integer orderItemSid, Double pQty) {
注:需要注意,同一个对象里面方法调用,不会作为异步方法执行。
在对 TextView 或者 EditText 进行赋值时,调用setText()方法,一定要注意,使用String类型,不要使用int 或者long,否则 会出现找不到资源的异常。系统自动会将int作为一个资源ID,然后去R 里面找,结果找不到。
摘要: http://blog.csdn.net/meng425841867/article/details/8523730
在按键单击事件中添加创建对话框并设置相关属性。
[java] view plain copy
dialogButton=(Button)findViewBy... 阅读全文
摘要: http://daoshud1.iteye.com/blog/1874241
本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView。 系统显示列表(ListView)时,首先会实例化一个适配器,本文将实例化一个自定义的适配器。实现 自定义适... 阅读全文
摘要: http://blog.csdn.net/x605940745/article/details/11981049
SimpleAdapter的参数说明 第一个参数 表示访问整个android应用程序接口,基本上所有的组件都需要 第二个参数表示生成一个Map(String ,Object)列表选项 第三个参数表示界面布局的id 表示该文件作为列表项的组件&... 阅读全文
首先是布局文件,这里需要两个布局文件,一个是放置列表控件的Activity对应的布局文件 main.xml,另一个是ListView中每一行信息显示所对应的布局 list_item.xml 这一步需要注意的问题是ListView 控件的id要使用Android系统内置的 android:id="@android:id/list" main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dip"/> </LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" >
<TextView android:id="@+id/user_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> <TextView android:id="@+id/user_id" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> </LinearLayout>
然后就设置MainActivity中的代码了:基本思想就是先将数据添加到ArrayList中,然后在设置SimpleAdapter适配器完成设置,入下:
package com.example.android_newlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.os.Bundle; import android.app.Activity; import android.app.ListActivity; import android.view.Menu; import android.widget.SimpleAdapter; public class MainActivity extends ListActivity { String[] from={"name","id"}; //这里是ListView显示内容每一列的列名 int[] to={R.id.user_name,R.id.user_id}; //这里是ListView显示每一列对应的list_item中控件的id
String[] userName={"zhangsan","lisi","wangwu","zhaoliu"}; //这里第一列所要显示的人名 String[] userId={"1001","1002","1003","1004"}; //这里是人名对应的ID
ArrayList<HashMap<String,String>> list=null; HashMap<String,String> map=null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); //为MainActivity设置主布局 //创建ArrayList对象; list=new ArrayList<HashMap<String,String>>(); //将数据存放进ArrayList对象中,数据安排的结构是,ListView的一行数据对应一个HashMap对象, //HashMap对象,以列名作为键,以该列的值作为Value,将各列信息添加进map中,然后再把每一列对应 //的map对象添加到ArrayList中
for(int i=0; i<4; i++){ map=new HashMap<String,String>(); //为避免产生空指针异常,有几列就创建几个map对象 map.put("id", userId[i]); map.put("name", userName[i]); list.add(map); }
//创建一个SimpleAdapter对象 SimpleAdapter adapter=new SimpleAdapter(this,list,R.layout.list_item,from,to); //调用ListActivity的setListAdapter方法,为ListView设置适配器 setListAdapter(adapter); } }另外对点击某一行作出响应的方法是覆写onListItemClick方法,根据返回的position(从0开始):
@Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); }
单数据{'singer':{'id':01,'name':'tom','gender':'男'}}
多个数据{"singers":[
{'id':02,'name':'tom','gender':'男'},
{'id':03,'name':'jerry,'gender':'男'},
{'id':04,'name':'jim,'gender':'男'},
{'id':05,'name':'lily,'gender':'女'}]} // 普通Json数据解析 private void parseJson(String strResult) { try { JSONObject jsonObj = new JSONObject(strResult).getJSONObject("singer"); int id = jsonObj.getInt("id"); String name = jsonObj.getString("name"); String gender = jsonObj.getString("gender"); tvJson.setText("ID号"+id + ", 姓名:" + name + ",性别:" + gender); } catch (JSONException e) { System.out.println("Json parse error"); e.printStackTrace(); } } //解析多个数据的Json private void parseJsonMulti(String strResult) { try { JSONArray jsonObjs = new JSONObject(strResult).getJSONArray("singers"); String s = ""; for(int i = 0; i < jsonObjs.length() ; i++){ JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i)).getJSONObject("singer"); int id = jsonObj.getInt("id"); String name = jsonObj.getString("name"); String gender = jsonObj.getString("gender"); s += "ID号"+id + ", 姓名:" + name + ",性别:" + gender+ "\n" ; } tvJson.setText(s); } catch (JSONException e) { System.out.println("Jsons parse error !"); e.printStackTrace(); } }
-
- Button Btn1 = (Button)findViewById(R.id.button1);
- Btn1.setOnClickListener(new Button.OnClickListener(){
- public void onClick(View v) {
- String strTmp = "点击Button01";
- Ev1.setText(strTmp);
- }
-
- });
-
- public void Btn3OnClick(View view){
- String strTmp="点击Button03";
- Ev1.setText(strTmp);
-
- }
- <Button
- android:id="@+id/button3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Button3"
- android:onClick="Btn3OnClick"/>
第三种方式 activity 实现 单击监听接口
public class TestButtonActivity extends Activity implements OnClickListener {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener( this );
btn2.setOnClickListener( this );
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText( this , "111111111" , Toast.LENGTH_SHORT);
tst.show();
break ;
case R.id.button2:
tst = Toast.makeText( this , "222222222" , Toast.LENGTH_SHORT);
tst.show();
break ;
default :
break ;
}
}
}
一、直接打开,不传递参数 Intent intent = new Intent(this, Activity.class);startActivity(intent);
二、传递参数
public void OpenNew(View v) { //新建一个显式意图,第一个参数为当前Activity类对象,第二个参数为你要打开的Activity类 Intent intent =new Intent(MainActivity.this,MainActivity2.class); //用Bundle携带数据 Bundle bundle=new Bundle(); //传递name参数为tinyphp bundle.putString("name", "tinyphp"); intent.putExtras(bundle); startActivity(intent);
//1.要关闭的页面 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.otheractivity); Intent intent = this.getIntent(); intent.putExtra("tel", 12345); //设置requestCode和带有数据的intent对象 OtherActivity.this.setResult(3, intent); //马上关闭Activity this.finish(); } //2.上面的页面关闭时,此页面进行数据的接收 class ButtonListener implements android.view.View.OnClickListener{ @Override public void onClick(View arg0) { Intent intent = new Intent(); intent.setClass(MainActivity.this, OtherActivity.class); //与普通的start方法不同,需要设置requestCode startActivityForResult(intent, 1); } } //如果要进行此操作,需要在数据接收页面中复写activity的onActivityResul()方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); int tel = 0; //根据返回码resultCode来判断下一步进行的业务代码 if(resultCode==3){ tel = data.getIntExtra("tel", 0); } Log.i(TAG, "tel--------->"+String.valueOf(tel)); } }
三、回传参数
1、不同android 版本,需要设置不同的 sytle 文件。 默认 通常我们会设置values下面的style 文件 但是如果是4.0以上,则还需要设置values-v14下面的style文件。 否则不能生效
找了很多方案,都说是那个KB939373 这个补丁搞的,但是在添加删除里就是找不到这个东东,重装也没有用,后来找到了这篇文章 http://www.cnblogs.com/skylaugh/archive/2011/07/21/2112860.html根据这篇文章,我把 infocomm.dll 给替换一下,然后就好了,简直就是坑爹啊。 这里讲讲需要注意的事项。 1、替换的文件通过iis安装文件生成,请看参考文章 2、文件直接黏贴覆盖,不要使用参考里面bat处理。 3、然后启动这个服务,启动iis,搞定
昨天部署web应用到Tomcat之后,无法成功启动,并且控制台没有详细的错误信息, 顶多就两行提示信息,例如: 严重: Error listenerStart 严重: Context [/] startup failed due to previous errors
或者
严重: Error filterStart org.apache.catalina.core.StandardContext start 严重: Context startup failed due to previous errors
查找logs目录下的信息,除了这两句话,也没别的辅助内容. 给查错带来了困难,在这种情况下,是因为Tomcat自身的默认日志没有将一些错误信息输出到控制台或文件, 这个时候则需要配置Tomcat自身的log,启用详细的调试日志.
3.log4j配置文件: log4j.properties 配置内容为:
log4j.rootLogger=ERROR,R
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%p]%t-%c-%m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=${catalina.home}/logs/tomcat.log log4j.appender.R.MaxFileSize=10MB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=[%p]%t-%c-%m%n
log4j.logger.org.apache.catalina=INFO,R,CONSOLE
#日志级别不能太低,如果配置为debug的话,输出的日志信息太多,导致tomcat启动非常的慢.
4.Tomcat 6.0所需的juli替换文件: http://www.apache.org/dist/--escaped_anchor:079305423cce36d6691457475e081123--/tomcat-6/v6.0.18/bin/extras/tomcat-juli-adapters.jar http://www.apache.org/dist/--escaped_anchor:079305423cce36d6691457475e081123--/tomcat-6/v6.0.18/bin/extras/tomcat-juli.jar 以上两个链接基本没用,大家可以搜索一下,csdn上面有人提供jar包下载,这里附件也不能加,没有办法。
在Tomcat6.0中,
将tomcat-juli-adapters.jar,log4j-1.2.15.jar,log4j.properties复制到D:\Java\ApacheTomcat6.0.14\lib下面.
将tomcat-juli.jar复制到D:\Java\apache-tomcat-6.0.14\bin\下面.
然后启动tomcat,就可以在D:\Java\apache-tomcat-6.0.14\logs下看到tomcat.log了.
在这个时候,再通过日志文件来分析,则会发现出现这种错误的情况可能有: (以下是我遇到的出错情况,大多是些低级错误) 1.webapps要用到的classe文件根本没有复制到WEB-INF/classes目录下面 (java.lang.NoClassDefFoundError,而这个信息可能默认没输出到控制台,尤其是用了spring的,昨天就是这个粗心的低级错误) 2.要用到lib文件没有复制完,缺少lib 3.lib下的同一个库的jar文件存在多个不同版本,引起版本冲突. 4.lib下的jar与tomcat版本不相对应(我遇到的问题是web应用在Tomcat5.5上运行正常,换到Tomcat6.0上就出错, 例如一个用了struts的webapp在Tomcat 6上报下面的错误 “Parse Fatal Error at line 17 column 6: The processing instruction target matching “[xX][mM][lL]” is not allowed” )
愿意看英文的可以参考官方网站说明: http://tomcat.apache.org/tomcat-6.0-doc/logging.html
标记一下:)
提示无法载入 c.tld等信息
只要删除 WEB-INF/lib 下的上述两个文件即可
因为此文件与 tomcat中的文件版本冲突
|