- 浏览: 1068245 次
- 性别:
- 来自: 南昌
文章分类
- 全部博客 (276)
- 生活 (1)
- 代码之美 (22)
- Media (7)
- Android Widget (3)
- Android Intent (1)
- Android Activity (4)
- UI event handle--UI事件处理机制 (2)
- Java基础知识 (12)
- android Databases (5)
- Android 系统知识 (70)
- 平常遇到的问题与解决方法 (38)
- Android TextView/EditView (2)
- Thinking Java (1)
- android webkit (6)
- JSON (1)
- XML (4)
- HTTP (1)
- Google Weather API (1)
- android 2.3 NFC (10)
- android app (20)
- android framework (7)
- C++ (2)
- android System (5)
- Pthread (1)
- Wifi (8)
- Unix/Linux C (8)
- Android 4.0 (1)
- Mail (1)
- Smack 源码学习 (4)
- iOS (4)
- Android (1)
- git (1)
- Gallery3d (2)
- React-Natice (1)
最新评论
-
dd18349182956:
你是用的smack哪个版本?我用的smack4.1.3和sma ...
关于socket长连接的心跳包 -
xukaiyin:
全英文
getApplicationContext()与this,getBaseContext() -
裂风矢:
...
<category android:name="android.intent.category.DEFAULT" /> 惹的祸 -
xanthodont:
mark一下
XMPP——Smack -
Evilover3:
mark一下,学习了
XMPP——Smack
再把QuickSearchBox放到桌面前,会先触发它的ConfigAcitivty,而这个config是对search 范围的选择:All, Web, Contact,Music...它的表现形式会有两种选择:一种是用ListView,另一种是用GridView.那么这里就会用到接口编程了。
我们先来看看用ListView显示的做法:Google将header+listview这样Activity用一个叫ChoiceActivty来实现,这样独立的模块,我们以后再开发的过程,若有需要也可以直接拿来用了,这样就做到了代码的重复利用了。
SearchWidgetConfigActivity就会继承ChoiceActivity:
protected CorpusView createView(ViewGroup parent) {
if (mGridView) {
return mViewFactory.createGridCorpusView(parent);
} else {
return mViewFactory.createListCorpusView(parent);
}
}这里就选择了是用GridView还是用ListView
这里就用到了接口编程的思想了:将一些规则抽象到CorpusViewFactory里面,那么通过CorpusViewFactory直接调用,不用管是如何实现的。真正的实现是在CorpusViewInflater。从代码看来若你想把ListView换成Gridview来表现,只需修改小部分代码:
1,SearchWidgetConfigActivity中:
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
-->
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createGridAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
2,ChoiceActivity中的choice_activity.xml
从这个例子中,可以看出了接口编程思想的重要与方便性。也许我讲得不是很清楚很明白,语言表达能力有限,只可意会不可言传。呵呵...
今天才发现,其实QuickSearchBox也用了GridView来显示search 范围的,是在CorpusSelectionDialog。
ListView的效果可以看附件里面的Listview.png,GridView看Gridview.png
我们先来看看用ListView显示的做法:Google将header+listview这样Activity用一个叫ChoiceActivty来实现,这样独立的模块,我们以后再开发的过程,若有需要也可以直接拿来用了,这样就做到了代码的重复利用了。
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; /** * Activity that shows a list of choices. */ public abstract class ChoiceActivity extends Activity { protected TextView mTitleView; protected ListView mChoicesView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.choice_activity); mTitleView = (TextView) findViewById(R.id.alertTitle); mChoicesView = (ListView) findViewById(R.id.list); } public void setHeading(int titleRes) { mTitleView.setText(titleRes); } public void setHeading(CharSequence title) { mTitleView.setText(title); } public void setAdapter(ListAdapter adapter) { mChoicesView.setAdapter(adapter); } public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { mChoicesView.setOnItemClickListener(listener); // TODO: for some reason, putting this in the XML layout instead makes // the list items unclickable. mChoicesView.setFocusable(true); } }
SearchWidgetConfigActivity就会继承ChoiceActivity:
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox; import com.android.quicksearchbox.ui.CorporaAdapter; import com.android.quicksearchbox.ui.CorpusViewFactory; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListAdapter; /** * The configuration screen for search widgets. */ public class SearchWidgetConfigActivity extends ChoiceActivity { private static final boolean DBG = false; private static final String TAG = "QSB.SearchWidgetConfigActivity"; private static final String PREFS_NAME = "SearchWidgetConfig"; private static final String WIDGET_CORPUS_NAME_PREFIX = "widget_corpus_"; private static final String WIDGET_CORPUS_SHOWING_HINT_PREFIX = "widget_showing_hint_"; private CorporaAdapter mAdapter; private int mAppWidgetId; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setHeading(R.string.search_widget); setOnItemClickListener(new SourceClickListener()); Intent intent = getIntent(); mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } // If there is only All, or only All and one other corpus, there is no // point in asking the user to select a corpus. if (getCorpusRanker().getRankedCorpora().size() <= 1) { selectCorpus(null); } } @Override protected void onStart() { setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker())); super.onStart(); } @Override protected void onStop() { setAdapter(null); super.onStop(); } @Override public void setAdapter(ListAdapter adapter) { if (adapter == mAdapter) return; if (mAdapter != null) mAdapter.close(); mAdapter = (CorporaAdapter) adapter; super.setAdapter(adapter); } protected void selectCorpus(Corpus corpus) { setWidgetCorpusName(mAppWidgetId, corpus); SearchWidgetProvider.updateSearchWidgets(this); Intent result = new Intent(); result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, result); finish(); } private static SharedPreferences getWidgetPreferences(Context context) { return context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE); } private static String getCorpusNameKey(int appWidgetId) { return WIDGET_CORPUS_NAME_PREFIX + appWidgetId; } private static String getShowingHintKey(int appWidgetId) { return WIDGET_CORPUS_SHOWING_HINT_PREFIX + appWidgetId; } private void setWidgetCorpusName(int appWidgetId, Corpus corpus) { String corpusName = corpus == null ? null : corpus.getName(); SharedPreferences.Editor prefs = getWidgetPreferences(this).edit(); prefs.putString(getCorpusNameKey(appWidgetId), corpusName); prefs.commit(); } public static String getWidgetCorpusName(Context context, int appWidgetId) { SharedPreferences prefs = getWidgetPreferences(context); return prefs.getString(getCorpusNameKey(appWidgetId), null); } public static void setWidgetShowingHint(Context context, int appWidgetId, boolean showing) { SharedPreferences.Editor prefs = getWidgetPreferences(context).edit(); prefs.putBoolean(getShowingHintKey(appWidgetId), showing); boolean c = prefs.commit(); if (DBG) Log.d(TAG, "Widget " + appWidgetId + " set showing hint " + showing + "("+c+")"); } public static boolean getWidgetShowingHint(Context context, int appWidgetId) { SharedPreferences prefs = getWidgetPreferences(context); boolean r = prefs.getBoolean(getShowingHintKey(appWidgetId), false); if (DBG) Log.d(TAG, "Widget " + appWidgetId + " showing hint: " + r); return r; } private CorpusRanker getCorpusRanker() { return QsbApplication.get(this).getCorpusRanker(); } private CorpusViewFactory getViewFactory() { return QsbApplication.get(this).getCorpusViewFactory(); } private class SourceClickListener implements AdapterView.OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Corpus corpus = (Corpus) parent.getItemAtPosition(position); selectCorpus(corpus); } } }从setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker()));不管是ListView还是用GrideView都会用到Adapter.
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import com.android.quicksearchbox.Corpus; import com.android.quicksearchbox.CorpusRanker; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.ArrayList; import java.util.List; /** * Adapter for showing a list of sources in the source selection activity. */ public class CorporaAdapter extends BaseAdapter { private static final String TAG = "CorporaAdapter"; private static final boolean DBG = false; private final CorpusViewFactory mViewFactory; private final CorpusRanker mRanker; private final DataSetObserver mCorporaObserver = new CorporaObserver(); private List<Corpus> mRankedEnabledCorpora; private boolean mGridView; private CorporaAdapter(CorpusViewFactory viewFactory, CorpusRanker ranker, boolean gridView) { mViewFactory = viewFactory; mRanker = ranker; mGridView = gridView; mRanker.registerDataSetObserver(mCorporaObserver); updateCorpora(); } public static CorporaAdapter createListAdapter(CorpusViewFactory viewFactory, CorpusRanker ranker) { return new CorporaAdapter(viewFactory, ranker, false); } public static CorporaAdapter createGridAdapter(CorpusViewFactory viewFactory, CorpusRanker ranker) { return new CorporaAdapter(viewFactory, ranker, true); } private void updateCorpora() { mRankedEnabledCorpora = new ArrayList<Corpus>(); for (Corpus corpus : mRanker.getRankedCorpora()) { if (!corpus.isCorpusHidden()) { mRankedEnabledCorpora.add(corpus); } } notifyDataSetChanged(); } public void close() { mRanker.unregisterDataSetObserver(mCorporaObserver); } public int getCount() { return 1 + mRankedEnabledCorpora.size(); } public Corpus getItem(int position) { if (position == 0) { return null; } else { return mRankedEnabledCorpora.get(position - 1); } } public long getItemId(int position) { return position; } /** * Gets the position of the given corpus. */ public int getCorpusPosition(Corpus corpus) { if (corpus == null) { return 0; } int count = getCount(); for (int i = 0; i < count; i++) { if (corpus.equals(getItem(i))) { return i; } } Log.w(TAG, "Corpus not in adapter: " + corpus); return 0; } public View getView(int position, View convertView, ViewGroup parent) { CorpusView view = (CorpusView) convertView; if (view == null) { view = createView(parent); } Corpus corpus = getItem(position); Drawable icon; CharSequence label; if (corpus == null) { icon = mViewFactory.getGlobalSearchIcon(); label = mViewFactory.getGlobalSearchLabel(); } else { icon = corpus.getCorpusIcon(); label = corpus.getLabel(); } if (DBG) Log.d(TAG, "Binding " + position + ", label=" + label); view.setIcon(icon); view.setLabel(label); return view; } protected CorpusView createView(ViewGroup parent) { if (mGridView) { return mViewFactory.createGridCorpusView(parent); } else { return mViewFactory.createListCorpusView(parent); } } private class CorporaObserver extends DataSetObserver { @Override public void onChanged() { updateCorpora(); } @Override public void onInvalidated() { updateCorpora(); } } }
protected CorpusView createView(ViewGroup parent) {
if (mGridView) {
return mViewFactory.createGridCorpusView(parent);
} else {
return mViewFactory.createListCorpusView(parent);
}
}这里就选择了是用GridView还是用ListView
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import android.graphics.drawable.Drawable; import android.net.Uri; import android.view.ViewGroup; /** * Creates corpus views. */ public interface CorpusViewFactory { CorpusView createGridCorpusView(ViewGroup parentViewType); CorpusView createListCorpusView(ViewGroup parentViewType); String getGlobalSearchLabel(); Drawable getGlobalSearchIcon(); Uri getGlobalSearchIconUri(); }
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import com.android.quicksearchbox.R; import com.android.quicksearchbox.util.Util; import android.content.Context; import android.graphics.drawable.Drawable; import android.net.Uri; import android.view.LayoutInflater; import android.view.ViewGroup; /** * Inflates corpus views. */ public class CorpusViewInflater implements CorpusViewFactory { private final Context mContext; public CorpusViewInflater(Context context) { mContext = context; } protected LayoutInflater getInflater() { return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public CorpusView createGridCorpusView(ViewGroup parentViewType) { return inflateCorpusView(R.layout.corpus_grid_item, parentViewType); } public CorpusView createListCorpusView(ViewGroup parentViewType) { return inflateCorpusView(R.layout.corpus_list_item, parentViewType); } protected CorpusView inflateCorpusView(int res, ViewGroup parentViewType) { return (CorpusView) getInflater().inflate(res, parentViewType, false); } public String getGlobalSearchLabel() { return mContext.getString(R.string.corpus_label_global); } private int getGlobalSearchIconResource() { return R.drawable.search_app_icon; } public Drawable getGlobalSearchIcon() { return mContext.getResources().getDrawable(getGlobalSearchIconResource()); } public Uri getGlobalSearchIconUri() { return Util.getResourceUri(mContext, getGlobalSearchIconResource()); } }
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import com.android.quicksearchbox.R; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; /** * A corpus in the corpus selection list. */ public class CorpusView extends RelativeLayout { private ImageView mIcon; private TextView mLabel; public CorpusView(Context context, AttributeSet attrs) { super(context, attrs); } public CorpusView(Context context) { super(context); } @Override protected void onFinishInflate() { super.onFinishInflate(); mIcon = (ImageView) findViewById(R.id.source_icon); mLabel = (TextView) findViewById(R.id.source_label); } public void setLabel(CharSequence label) { mLabel.setText(label); } public void setIcon(Drawable icon) { mIcon.setImageDrawable(icon); } }
这里就用到了接口编程的思想了:将一些规则抽象到CorpusViewFactory里面,那么通过CorpusViewFactory直接调用,不用管是如何实现的。真正的实现是在CorpusViewInflater。从代码看来若你想把ListView换成Gridview来表现,只需修改小部分代码:
1,SearchWidgetConfigActivity中:
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
-->
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createGridAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
2,ChoiceActivity中的choice_activity.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2010 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="9dip" android:paddingBottom="3dip" android:paddingLeft="3dip" android:paddingRight="1dip" > <LinearLayout android:id="@+id/topPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="54dip" android:background="@drawable/popup_top_dark" android:orientation="vertical"> <LinearLayout android:id="@+id/titlePanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:layout_marginTop="6dip" android:layout_marginBottom="9dip" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:paddingTop="6dip" android:paddingRight="10dip" android:src="@drawable/ic_dialog_menu_generic" /> <TextView android:id="@+id/alertTitle" style="?android:attr/textAppearanceLarge" android:singleLine="false" android:maxLines="3" android:ellipsize="end" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@null" android:background="@drawable/popup_bottom_bright" android:divider="@drawable/divider_horizontal_bright" android:scrollbars="vertical" /> </LinearLayout>中的ListView换成GridView就可以了。
从这个例子中,可以看出了接口编程思想的重要与方便性。也许我讲得不是很清楚很明白,语言表达能力有限,只可意会不可言传。呵呵...
今天才发现,其实QuickSearchBox也用了GridView来显示search 范围的,是在CorpusSelectionDialog。
ListView的效果可以看附件里面的Listview.png,GridView看Gridview.png
发表评论
-
ACTIVITY的LAUNCH MODE详解 SINGLETASK正解
2012-05-30 08:58 1103转自:http://www.cnblogs.com/xiaoQ ... -
android的一些开源项目
2011-12-06 14:08 1186转自:http://www.iteye.com/problem ... -
修改StatusBar
2011-10-10 10:27 1252转自:http://iserveandroid.blogspo ... -
单独一个应用程序换语言
2011-09-29 15:16 1443转自http://blog.csdn.net/sodino/a ... -
通过代码设置live wall paper
2011-09-02 09:17 25141. The code is: private Wall ... -
Android camera 默认显示黑白的问题
2011-06-08 16:18 2540转自:http://tassardge.blog. ... -
关于Activity切换动画——overridePendingTransition
2011-05-25 14:33 5766Activity的切换动画指的是从一个activity跳转到另 ... -
sendBroadcast和sendStickyBroadcast的区别
2011-04-28 13:39 9716我们平时最经常使用的是sendBroadcast,就是把一个I ... -
Settings.System.getInt获取Setting里面的一些设置
2011-04-28 10:29 7030好久没有更新博客了,其实这期间我都在研究android如何换皮 ... -
Service 启动Activity
2011-03-11 11:06 25175我想我们一般在Service里想启动Activity一定会这样 ... -
Android Windows
2011-03-11 09:45 2050转自:http://elsila.blog.163.com/b ... -
IntentService
2011-03-11 09:23 3444看android的源码可以发现很多很多有趣有用的代码,今天在看 ... -
AsyncQueryHandler
2011-03-02 15:10 6796在QuickContactBadge里面我 ... -
QuickContactBadge如何实现
2011-03-02 11:52 4914从前一篇,我们知道了如何使用了QuikcContactBadg ... -
如何使用QuickContactBadge
2011-03-02 09:34 4064参考文章:http://mobile.tutsplus.com ... -
QuickSearcheBox---SearchManager获取search列表
2011-02-25 14:05 1854在android 2.2之后加入了SearchManager, ... -
RemoteView总结
2011-02-23 11:15 2340我最初认识RemoteView是在AppWidget里面的,但 ... -
Google Search Widget, Google Search ap, Globe Search ap
2011-02-23 10:39 1289http://blog.csdn.net/Judy889/ar ... -
调用android system Search UI须注意的问题
2011-02-23 10:38 1543http://blog.csdn.net/Judy889/ar ...
相关推荐
51单片机
双级式储能模型,可做充放电转以及低电压故障穿越,含有负序抑制模块,可做对称故障与不对称故障
郑州升达大学2024-2025第一学期计算机视觉课程期末试卷,原版。配套教材为《OpenCV计算机视觉基础教程》夏帮贵主编。
线切割课后试题
目录 摘 要 1 一、设计任务概述 3 1.1 设计目的 3 1.2 项目任务和要求 3 1.3 参考资料 3 二、项目开发环境 4 三、项目需求分析 5 四、 项目设计和实现 5 4.1 总体设计 5 4.2 功能设计 6 4.3 系统实现 7 五、系统运行和测试 12 六、设计总结 15 七、附录 16 7.1 程序清单 16 7.2 其他需要说明的内容 23。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
智慧物联网系统发展战略研究
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
电机与拖动技术三级项目报告,直流电动机是电机的主要类型之一,具有调速范围广、调速特性平滑、过载能力强等优点,在生产生活中具有广泛的应用。此次课程项目阐述了直流电动机的结构、应用、并着重对电枢回路串电阻分级启动进行深入研究,MATLAB仿真软件对直流电动机分级启动进行仿真。
详细说明:https://blog.csdn.net/a342874650/article/details/144989766 在 Web 应用中,恶意用户可能会通过频繁刷新接口或进行暴力请求来攻击系统,导致服务器负载过高或服务不可用。为了应对这一问题,本文将详细介绍如何使用 Spring Boot 结合拦截器(Interceptor)和 Redis 来实现基于 URL 和 IP 的访问频率限制。具体实现包括拦截器拦截请求、Redis 存储访问记录、检测访问频率并在达到限制时禁用 IP 的完整过程。通过本文的详细实现过程和完整源代码,读者可以快速掌握如何在自己的项目中应用这一机制来增强系统的安全性和稳定性。
内容概要:本文详细介绍了JavaEE核心技术,涵盖多个重要的Web框架和持久层技术,以及其应用场景和实施方案。具体内容包括:①Struts框架的特点和功能,特别是其对MVC架构的支持,以及如何应用于薪资管理系统;②MVC架构的基本概念和如何通过JSP、JavaBean及Servlet实现成绩管理系统;③Spring IoC容器的工作原理,强调其控制反转和依赖注入功能,展示了整合Struts和JPA的具体案例,如通讯管理系统Web层设计方案;④Spring MVC结构及其XML配置方法,并提出一种针对图书管理系统的Spring MVC实现思路;⑤深入探讨Spring AOP原理,介绍如何使用XML配置进行统一事务处理的应用方案;⑥分析Hibernate核心接口及设备管理系统持久层设计方案;⑦整合Hibernate和Spring IoC实现的成绩管理系统持久层设计方案。 适合人群:具备一定Java基础的初、中级JavaEE开发者,对JavaWeb开发有兴趣的学习者。 使用场景及目标:①帮助开发者理解JavaEE关键技术和框架的实际运用,提高项目开发技能;②指导实际项目的架构设计和技术选型;③促进团队协作,提高代码复用性和维护效率。 阅读建议:建议读者根据自身经验和兴趣选择重点章节仔细研读,并结合实际情况尝试实践,逐步掌握各知识点。此外,还应该结合最新的API文档和技术论坛资料不断跟进更新。
easy-interceptor修改请求头和响应头.zip
Prime_Series_Level-1.z10 别下,这个是分卷压缩,笔者用来备份的
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
CST0402B+跟岗实习提交资料.zip
基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目),个人大三大设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为毕业设计、课程设计、期末大作业。 基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文
本金1W利息0.0325,几年能double?
matlab机械臂关节空间轨迹规划,3-5-3分段多项式插值法,六自由度机械臂,该算法可运用到仿真建模机械臂上实时运动,可视化轨迹,有角度,速度,加速度仿真曲线。 也可以有单独角度,速度,加速度仿真曲线。 可自行更程序中机械臂与点的参数。 谢谢大家 (程序中均为弧度制参数)353混合多项式插值
2011-2023年各省金融监管水平数据(含原始数据+计算过程+计算结果) 1、时间:2011-2023年 2、来源:国家统计J、统计NJ 3、指标:金融业增加值、金融监管支出、金融监管水平 4、计算方法:金融监管水平=金融监管支出/金融业增加值
本表名称为简易手写识字表,收录了21000多个汉字,每个汉字后面附上了简易手写笔画和输入编码。独体字是一个主笔画和一个字母编码,双码字是两个主笔画组合和两个字母编码,多码字是两个主笔画组合和三个字母编码。可用于识字、简易手写和大键盘汉字输入等参考。