最近很多小伙伴都在问Red5提示错误cannotconvertvalueoftypeorg.red5.serv和red53v1.exe遇到错误怎么办这两个问题,那么本篇文章就来给大家详细解答一下,同时
最近很多小伙伴都在问Red5 提示错误 cannot convert value of type org.red5.serv和red53v1.exe遇到错误怎么办这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Angular4_Cannot read property 'value' of undefined、C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘m...、cannot convert t (type interface {}) to type string: need type assertion、cannot convert value of type 'String!' to expected argument type 'inout String'等相关知识,下面开始了哦!
本文目录一览:- Red5 提示错误 cannot convert value of type org.red5.serv(red53v1.exe遇到错误怎么办)
- Angular4_Cannot read property 'value' of undefined
- C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘m...
- cannot convert t (type interface {}) to type string: need type assertion
- cannot convert value of type 'String!' to expected argument type 'inout String'
Red5 提示错误 cannot convert value of type org.red5.serv(red53v1.exe遇到错误怎么办)
可能是因为在 web-inf 目录下 lib 文件夹中的 jar 文件和 Red5 自身的产生冲突造成的,在项目资源下新建 libs 文件夹,并将 Red5 自身已包含的 jar 文件放置到这个文件中可以解决这个问题。Angular4_Cannot read property 'value' of undefined
Cannot read property ''value'' of undefined
出错代码
<div> <p>Packaging Type</p> <select[(ngModel)]="popuppackagingType" name="popuppackagingType" (change)="popupPackagTypeChange(packagingtype.value)"#popuppackagingtype> <option *ngFor="let type of packagingTypes" value="{{type.value}}"> {{type.key}} </option> </select> </div>
具体出错的地方
解决方法是
原因是:点击 =》自己理解
C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘m...
先看代码(不想看代码可以直接看代码后的问题描述)
//header.h
#ifndef _HEADER_H
#define _HEADER_H
#define defaultSize 128
#include<iostream>
#include<string.h>
using namespace std;
class myString
{
private:
char *ch;
int curLength;
int maxSize;
public:
myString(int sz=defaultSize);
myString(const char *init);
myString(const myString& ob);
~myString(){delete []ch;}
void print();
int Length()const;
myString operator()(int pos, int len);
myString& operator = (myString& ob);
};
myString& myString::operator = (myString& ob)
{
if(&ob!=this)
{
delete[]ch;
this->ch = new char[ob.maxSize];
this->maxSize = ob.curLength;
strcpy(this->ch, ob.ch);
this->curLength = ob.curLength;
}
else
{
cerr<<"String copy error\n";
}
return *this;
}
myString myString::operator()(int pos, int len)
{
myString temp;
if(pos<0 || len<=0 || pos+len-1>=this->maxSize)
{
temp.curLength = 0;
temp.ch[0] = ''\0'';
}
else
{
if(pos+len-1 >= this->curLength)
len = this->curLength-pos;
temp.curLength = len;
for(int i=0,j=pos; i<len; ++i,++j)
temp.ch[i] = this->ch[j];
temp.ch[len] = ''\0'';
}
return temp;
}
int myString::Length()const
{
return this->curLength;
}
void myString::print()
{
cout<<this->ch<<endl;
}
myString::myString(int sz)
{
this->maxSize = sz;
this->ch = new char[this->maxSize+1];
if(this->ch == NULL)
{
cerr<<"Allocation ERROR\n";
exit(1);
}
this->curLength = 0;
ch[0] = ''\0'';
}
myString::myString(const char *init)
{
int len = strlen(init);
this->maxSize = (len > defaultSize) ? len : defaultSize;
this->ch = new char[this->maxSize+1];
if(this->ch == NULL)
{
cerr<<"Application Memory ERROR\n";
exit(1);
}
this->curLength = len;
strcpy(this->ch, init);
}
myString::myString(const myString& ob)
{
this->maxSize = ob.maxSize;
this->ch = new char[this->maxSize+1];
if(this->ch == NULL)
{
cerr<<"Application Memory ERROR\n";
exit(1);
}
this->curLength = ob.curLength;
strcpy(this->ch, ob.ch);
}
#endif
//main.cpp
#include"header.h"
int main()
{
myString st(10), st1("ABCDEFG");
myString st2(st1);
st.print(), st1.print(), st2.print();
st = st1(0, 4);//???
st.print();
return 0;
}
这是一个字符串类,问题出现在了两个符号重载,()和=
()重载是想对字符串对象做一个切片,返回一个临时对象,=重载就不用说了,就是赋值。
问题就出现在总是无法将这个切片后的临时对象赋值给等号前的对象,编译后如下:
在网上一番查找后找到一个类似问题
https://blog.csdn.net/u011068702/article/details/64443949
也就是说,在st1(0,4)时存在了一个临时变量,当把这个临时变量传给st时,由于在=重载函数声明中,参数为myString&,而并不是常量引用。
这个错误是C++编译器的一个关于语义的限制。
如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。
了解这个语义以后就简单了,只需给=重载参数加上const常量限制符。
(类中=重载函数声明也别忘了要加上const)
加上以后程序的运行结果
可以,很正确。
总结:
c++中临时变量不能作为非const的引用参数
2019/12/14更新
最近看到一个类似问题,即C++11
int i=0;
++++i;//这样是可以的
i++++;//这样就是错误的
我们知道前++就是直接对对象自增后返回对象,而后++会先返回记录当前值,在自增,最后返回一个无名的临时对象,那么 i++++就是让第一个后++返回的无名临时对象再自增,这样对C++是无意义的,所以这样就无法编译通过。//ps.这就是常说的 举一隅以三隅反 吧
cannot convert t (type interface {}) to type string: need type assertion
问题:
在使用interface表示任何类型时,如果要将interface转为某一类型,直接强制转换是不行的,例如:
var t interface{} = "abc" s := string(t)
cannot convert t(type interface {}) to type string: need type assertion
这样是不行的,需要进行type assertion类型断言,具体使用方法请参考:
golang 任何类型interface{}
更多信息:
http://www.jb51.cc/article/p-amhitjiw-bnz.html
cannot convert value of type 'String!' to expected argument type 'inout String'
var area_big:String!var area_small:String!
var types = ""
var firstIn = true
provinces.forEach { (province) in
let count = province.children.count
for i in 0..<count{
if i == 0 && province.children[i].checked {
if area_big == nil {
area_big = province.children[i].attributes["name"]
}else{
area_big += "#" + province.children[i].attributes["name"]!
}
}
}
}
如果是按照上面那样写 ,会报如题错误。改为如下就可以了
var area_big:String! var area_small:String! var types = "" var firstIn = true provinces.forEach { (province) in let count = province.children.count for i in 0..<count{ if i == 0 && province.children[i].checked { if area_big == nil { area_big = province.children[i].attributes["name"] }else{ area_big = area_big + "#" + province.children[i].attributes["name"]! } } } }
今天关于Red5 提示错误 cannot convert value of type org.red5.serv和red53v1.exe遇到错误怎么办的讲解已经结束,谢谢您的阅读,如果想了解更多关于Angular4_Cannot read property 'value' of undefined、C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘m...、cannot convert t (type interface {}) to type string: need type assertion、cannot convert value of type 'String!' to expected argument type 'inout String'的相关知识,请在本站搜索。
本文将带您了解关于CoordinatorLayou eclipse中使用出现的问题的新内容,同时我们还将为您解释eclipse corrosion的相关知识,另外,我们还将为您提供关于android CoordinatorLayout 使用、android – CoordinatorLayout与RecyclerView和Collapsing标题、android – 使用AppBarLayout在CoordinatorLayout中滚动显示/隐藏BottomNavigationView、android – 另一个CoordinatorLayout里面的CoordinatorLayout的实用信息。
本文目录一览:- CoordinatorLayou eclipse中使用出现的问题(eclipse corrosion)
- android CoordinatorLayout 使用
- android – CoordinatorLayout与RecyclerView和Collapsing标题
- android – 使用AppBarLayout在CoordinatorLayout中滚动显示/隐藏BottomNavigationView
- android – 另一个CoordinatorLayout里面的CoordinatorLayout
CoordinatorLayou eclipse中使用出现的问题(eclipse corrosion)
第一个问题
1、在项目文件project.properties 中把 target改成 23
2、导入\sdk\extras\android\support\design到工作区间中
3、在design中修改project.properties中的target为23
4、如果项目中引入了v7项目,那就删除,引入design就行,因为design项目中需要引入v7要不然style中会报错。
5、Clean项目。
第二个问题
问题大致意思是多次导入了v7包,请包libs中的v7包干掉Clean项目就行了。
android CoordinatorLayout 使用
一、CoordinatorLayout 有什么作用
CoordinatorLayout 作为 “super-powered FrameLayout” 基本实现两个功能: 1、作为顶层布局 2、调度协调子布局
CoordinatorLayout 使用新的思路通过协调调度子布局的形式实现触摸影响布局的形式产生动画效果。CoordinatorLayout 通过设置子 View 的 Behaviors 来调度子 View。系统(Support V7)提供了 AppBarLayout.Behavior, AppBarLayout.ScrollingViewBehavior, FloatingActionButton.Behavior, SwipeDismissBehavior<V extends View> 等。 使用 CoordinatorLayout 需要在 Gradle 加入 Support Design Library:
compile ''com.android.support:design:22.2.1'' 1 1 二、CoordinatorLayout 与 FloatingActionButton
定义布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/ic_done" />
</android.support.design.widget.CoordinatorLayout> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CoordinatorLayout 作为 “super-powered FrameLayout”,设置子视图的 Android:layout_gravity 属性控制位置。
Activity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view,"FAB",Snackbar.LENGTH_LONG)
.setAction("cancel", new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里的单击事件代表点击消除Action后的响应事件
}
})
.show();
}
});
}
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 效果:
FloatingActionButton 是最简单的使用 CoordinatorLayout 的例子,FloatingActionButton 默认使用 FloatingActionButton.Behavior。 三、CoordinatorLayout 与 AppBarLayout
3.1 AppBarLayout 嵌套 TabLayout
布局文件代码:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_done" />
</android.support.design.widget.CoordinatorLayout> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 效果:
效果显示,视图滚动时,Toolbar 会隐藏,这个效果是 Android Support Library 里面,新增的 CoordinatorLayout, AppBarLayout 实现的。通过 AppBarLayout 的子视图的属性控制。观察 AppBarLayout 的子布局,Toobar 有 app:layout_scrollFlags 属性,这就是控制滑动时视图效果的属性。app:layout_scrollFlags 有四个值: scroll: 所有想滚动出屏幕的 view 都需要设置这个 flag, 没有设置这个 flag 的 view 将被固定在屏幕顶部。例如,TabLayout 没有设置这个值,将会停留在屏幕顶部。 enterAlways: 设置这个 flag 时,向下的滚动都会导致该 view 变为可见,启用快速 “返回模式”。 enterAlwaysCollapsed: 当你的视图已经设置 minHeight 属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。 exitUntilCollapsed: 滚动退出屏幕,最后折叠在顶端。 为了 ToolBar 可以滚动,CoordinatorLayout 里面,放一个带有可滚动的 View. 如上的例子,放的是 ViewPager, 而 ViewPager 里面是放了 RecylerView 的,即是可以滚动的 View。CoordinatorLayout 包含的子视图中带有滚动属性的 View 需要设置 app:layout_behavior 属性。例如,示例中 Viewpager 设置了此属性。
app:layout_behavior="@string/appbar_scrolling_view_behavior" 1 1 为了使得 Toolbar 有滑动效果,必须做到如下三点:
- CoordinatorLayout 作为布局的父布局容器。
- 给需要滑动的组件设置 app:layout_scrollFlags=”scroll|enterAlways” 属性。
- 给滑动的组件设置 app:layout_behavior 属性 3.2 AppBarLayout 嵌套 CollapsingToolbarLayout
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="256dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp">
<ImageView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
android:src="@drawable/header"
app:layout_collapseMode="parallax"
/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="24dp">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp">
<LinearLayout
style="@style/Widget.CardContent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="CardView"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/card_string" />
</LinearLayout>
</android.support.v7.widget.CardView>
……
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
android:src="@drawable/ic_done"
android:layout_margin="@dimen/fab_margin"
android:clickable="true"/>
</android.support.design.widget.CoordinatorLayout> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 效果:
这种效果在详情页面用的较多,展示个性化内容,图像有强烈的吸引力。这个效果重点使用了 CollapsingToolbarLayout 。 CollapsingToolbarLayout 可实现 Toolbar 的折叠效果。CollapsingToolbarLayout 的子视图类似与 LinearLayout 垂直方向排放。
CollapsingToolbarLayout 提供以下属性和方法是用:
- Collapsing title:ToolBar 的标题,当 CollapsingToolbarLayout 全屏没有折叠时,title 显示的是大字体,在折叠的过程中,title 不断变小到一定大小的效果。你可以调用 setTitle (CharSequence) 方法设置 title。
- Content scrim:ToolBar 被折叠到顶部固定时候的背景,你可以调用 setContentScrim (Drawable) 方法改变背景或者 在属性中使用 app:contentScrim=”?attr/colorPrimary” 来改变背景。
- Status bar scrim:状态栏的背景,调用方法 setStatusBarScrim (Drawable)。还没研究明白,不过这个只能在 Android5.0 以上系统有效果。
- Parallax scrolling children:CollapsingToolbarLayout 滑动时,子视图的视觉差,可以通过属性 app:layout_collapseParallaxMultiplier=”0.6” 改变。值 de 的范围 [0.0,1.0],值越大视察越大。
- CollapseMode :子视图的折叠模式,在子视图设置,有两种 “pin”:固定模式,在折叠的时候最后固定在顶端;“parallax”:视差模式,在折叠的时候会有个视差折叠的效果。我们可以在布局中使用属性 app:layout_collapseMode=”parallax” 来改变。
CoordinatorLayout 还提供了一个 layout_anchor 的属性,连同 layout_anchorGravity 一起,可以用来放置与其他视图关联在一起的悬浮视图(如 FloatingActionButton)。本例中使用 FloatingActionButton。
通过下面的参数设置了 FloatingActionButton 的位置,两个属性共同作用使得 FAB 浮动按钮也能折叠消失,展现。
app:layout_anchor="@id/appbar" app:layout_anchorGravity="bottom|right|end" 1 2 1 2 使用 CollapsingToolbarLayout 实现折叠效果,需要注意 3 点
- AppBarLayout 的高度固定
- CollapsingToolbarLayout 的子视图设置 layout_collapseMode 属性
- 关联悬浮视图设置 app:layout_anchor,app:layout_anchorGravity 属性 四、自定义 behavior
CoordinatorLayout 功能如此强大,而他的神奇之处在于 Behavior 对象,CoordinatorLayout 自己并不控制 View,所有的控制权都在 Behavior。前面写到了 FloatingActionButton.Behavior,AppBarLayout.Behavior, AppBarLayout.ScrollingViewBehavior。 AppBarLayout 中有两个 Behavior,一个是拿来给它自己用的,另一个是拿来给它的兄弟结点用的。这些 Behavior 实现了复杂的控制功能。系统的 Behavior 毕竟有限,我们可以通过自定义的方式来实现自己的 Behavior。
通过 CoordinatorLayout.Behavior (YourView.Behavior.class) 来定义自己的 Behavior,并在 layout 文件中设置 app:layout_behavior=”com.example.app.YourView$Behavior” 来达到效果。
自定义 Behavior 需要重写两个方法:
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency)
public boolean onDependentViewChanged (CoordinatorLayout parent, View child, View dependency) 1 2 3 1 2 3 如下面的例子,实现了点击 FloatingActionButton 点击旋转 90 度,并适配 Snackbar。
public class RotateBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { private static final String TAG = RotateBehavior.class.getSimpleName();
public RotateBehavior() {
}
public RotateBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
return dependency instanceof Snackbar.SnackbarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
float translationY = getFabTranslationYForSnackbar(parent, child);
float percentComplete = -translationY / dependency.getHeight();
child.setRotation(-90 * percentComplete);
child.setTranslationY(translationY);
return false;
}
private float getFabTranslationYForSnackbar(CoordinatorLayout parent,
FloatingActionButton fab) {
float minOffset = 0;
final List<View> dependencies = parent.getDependencies(fab);
for (int i = 0, z = dependencies.size(); i < z; i++) {
final View view = dependencies.get(i);
if (view instanceof Snackbar.SnackbarLayout && parent.doViewsOverlap(fab, view)) {
minOffset = Math.min(minOffset,
ViewCompat.getTranslationY(view) - view.getHeight());
}
}
return minOffset;
}
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"> <android.support.design.widget.FloatingActionButton android:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="end|bottom"android:layout_margin="@dimen/fab_margin"android:src="@drawable/ic_done"app:layout_behavior="com.meizu.coordinatorlayoutdemo.RotateBehavior"/> </android.support.design.widget.CoordinatorLayout> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 效果:
综上,基本覆盖了 CoordinatorLayout 的使用方式。
顶 39
android – CoordinatorLayout与RecyclerView和Collapsing标题
(工具栏,
标题视图,文本视图,RecyclerView)
当我滚动recyclelerview的项目时,我需要标题被折叠.
这样就可以在屏幕上看到“选择项目”和回收器视图.
当工具栏被折叠时,我看到了示例,但是我需要工具栏来始终存在.
我应该使用哪些布局/行为来完成这项工作?
解决方法
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <!-- HEADER --> <RelativeLayout ... app:layout_collapseMode="parallax"> ..... </RelativeLayout> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> <!-- IF YOU WANT TO KEEP "Choose Item" always on top of the RecyclerView,put this TextView here <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:text="choose item" /> --> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout>
通过拥有app:layout_collapseMode =“pin”属性设置您的工具栏.您可以通过设置app:layout_behavior =“@ string / appbar_scrolling_view_behavior”使RecyclerView正常滚动,这几乎是这样.
NB! “选择项目”的位置TextView取决于您要实现的特定行为:
>您可以将其作为RecyclerView适配器的第一个元素,将其滚动,一旦用户开始滚动RecyclerView;
>你可以将它添加到AppBarLayout中,这样它总是坚持在RecyclerView的顶部,每当你滚动它或不;
您可以在这里阅读更多Android Design Support Library和Design Support Library (III): Coordinator Layout
我希望,它有帮助!
android – 使用AppBarLayout在CoordinatorLayout中滚动显示/隐藏BottomNavigationView
我的意思是这样的:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="false"> <android.support.design.widget.AppBarLayout android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_insetEdge="top" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_scrollFlags="scroll|enteralways"/> </android.support.design.widget.AppBarLayout> <android.support.design.widget.BottomNavigationView android:id="@+id/bottom_nav" android:layout_width="match_parent" android:layout_height="56dp" android:layout_gravity="bottom" app:menu="@menu/menu_bottom_navigation"/> <FrameLayout android:id="@+id/content_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </android.support.design.widget.CoordinatorLayout>
如您所见,我还有一个FrameLayout,用于包含具有实际内容的片段.目前,BottomNavigationView没有默认/内置行为 – 既不是视图本身,也不是它的兄弟.现有的appbar_scrolling_view_behavior与appbar协调处理内容视图,但忽略其他兄弟.
我正在寻找一种隐藏的方法,并在滚动时显示appbar和底部导航视图.
解决方法
Behavior
.它的主要思想是检测何时滚动BottomNavigationView的兄弟,以便它可以隐藏BottomNavigationView.像这样的东西:
public class BottomNavigationBehavior extends CoordinatorLayout.Behavior<BottomNavigationView> { public BottomNavigationBehavior() { super(); } public BottomNavigationBehavior(Context context,AttributeSet attrs) { super(context,attrs); } @Override public boolean layoutDependsOn(CoordinatorLayout parent,BottomNavigationView child,View dependency) { boolean dependsOn = dependency instanceof FrameLayout; return dependsOn; } @Override public boolean onStartnestedScroll(CoordinatorLayout coordinatorLayout,View directTargetChild,View target,int nestedScrollAxes) { return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; } @Override public void onnestedPreScroll(CoordinatorLayout coordinatorLayout,int dx,int dy,int[] consumed) { if(dy < 0) { showBottomNavigationView(child); } else if(dy > 0) { hideBottomNavigationView(child); } } private void hideBottomNavigationView(BottomNavigationView view) { view.animate().translationY(view.getHeight()); } private void showBottomNavigationView(BottomNavigationView view) { view.animate().translationY(0); } }
如您所见,我使用简单的ViewPropertyAnimator
,使用子视图的animate
方法获得.这导致了一个简单的动画,它与AppBarLayout的行为并不完全匹配,但它足够好看,同时它很容易实现.
我希望在某些时候Android团队会在支持库中为BottomNavigationView添加一个默认行为,所以我认为花更多的时间来完全复制AppBarLayout的行为是不合理的.
编辑(2018年4月):有关onStartnestedScroll和onnestedPreScroll及其新版本的详细说明,请参阅注释部分.
android – 另一个CoordinatorLayout里面的CoordinatorLayout
CorodinatorLayout在另一个CoordinatorLayout内部,这样滚动子视图也应该滚动Parent CoordinatorLayout.
我有一个带有ViewPager的coordinatorLayout,它包含不同的Fragment,以便在Scroll上隐藏tabLayout
我有另一个具有viewPager的coordinatorLayout.此片段在父片段(父协调器布局)的ViewPager中膨胀.
问题是在childViewpager中滚动子片段只反映在子片段的协调器布局中,而不是在我需要做的隐藏tablayout的父协调器布局中.
结构是:
CoordinatorLayout(p) ->(tablayout(p) & ViewPager(p) -> CoordinatorLayout(c) ->(tablayout(c) & ViewPAger(c) ->recyclerView(cc)))
p -> parent;
c -> child; cc -> child to child
如何在滚动回收器视图上进行操作将影响协调器布局,以便工具栏tablayout(p)将被隐藏.
解决方法:
我知道这是一个老问题.
但是我搜索了很长一段时间在一个片段中包含一个CoordinatorLayout,它位于另一个CoordinatorLayout中.
我稍微修改了dev.bmax的答案,调用两个协调器布局并调用两个布局的附加行为.
所以这是我的解决方案.
@SuppressWarnings("unused")
public class nestedCoordinatorLayout extends CoordinatorLayout implements nestedScrollingChild {
private nestedScrollingChildHelper mChildHelper;
public nestedCoordinatorLayout(Context context) {
super(context);
mChildHelper = new nestedScrollingChildHelper(this);
setnestedScrollingEnabled(true);
}
public nestedCoordinatorLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mChildHelper = new nestedScrollingChildHelper(this);
setnestedScrollingEnabled(true);
}
public nestedCoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mChildHelper = new nestedScrollingChildHelper(this);
setnestedScrollingEnabled(true);
}
@Override
public boolean onStartnestedScroll(View child, View target, int nestedScrollAxes) {
/* Enable the scrolling behavior of our own children */
boolean tHandled = super.onStartnestedScroll(child, target, nestedScrollAxes);
/* Enable the scrolling behavior of the parent's other children */
return startnestedScroll(nestedScrollAxes) || tHandled;
}
@Override
public void onStopnestedScroll(View target) {
/* disable the scrolling behavior of our own children */
super.onStopnestedScroll(target);
/* disable the scrolling behavior of the parent's other children */
stopnestedScroll();
}
@Override
public void onnestedPreScroll(View target, int dx, int dy, int[] consumed) {
int[][] tConsumed = new int[2][2];
super.onnestedPreScroll(target, dx, dy, tConsumed[0]);
dispatchnestedPreScroll(dx, dy, tConsumed[1], null);
consumed[0] = tConsumed[0][0] + tConsumed[1][0];
consumed[1] = tConsumed[0][1] + tConsumed[1][1];
}
@Override
public void onnestedScroll(View target, int dxconsumed, int dyConsumed,
int dxUnconsumed, int dyUnconsumed) {
super.onnestedScroll(target, dxconsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
dispatchnestedScroll(dxconsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null);
}
@Override
public boolean onnestedPreFling(View target, float veLocityX, float veLocityY) {
boolean tHandled = super.onnestedPreFling(target, veLocityX, veLocityY);
return dispatchnestedPreFling(veLocityX, veLocityY) || tHandled;
}
@Override
public boolean onnestedFling(View target, float veLocityX, float veLocityY, boolean consumed) {
boolean tHandled = super.onnestedFling(target, veLocityX, veLocityY, consumed);
return dispatchnestedFling(veLocityX, veLocityY, consumed) || tHandled;
}
@Override
public void setnestedScrollingEnabled(boolean enabled) {
mChildHelper.setnestedScrollingEnabled(enabled);
}
@Override
public boolean isnestedScrollingEnabled() {
return mChildHelper.isnestedScrollingEnabled();
}
@Override
public boolean startnestedScroll(int axes) {
return mChildHelper.startnestedScroll(axes);
}
@Override
public void stopnestedScroll() {
mChildHelper.stopnestedScroll();
}
@Override
public boolean hasnestedScrollingParent() {
return mChildHelper.hasnestedScrollingParent();
}
@Override
public boolean dispatchnestedScroll(int dxconsumed, int dyConsumed, int dxUnconsumed,
int dyUnconsumed, int[] offsetInWindow) {
return mChildHelper.dispatchnestedScroll(dxconsumed, dyConsumed, dxUnconsumed,
dyUnconsumed, offsetInWindow);
}
@Override
public boolean dispatchnestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
return mChildHelper.dispatchnestedPreScroll(dx, dy, consumed, offsetInWindow);
}
@Override
public boolean dispatchnestedFling(float veLocityX, float veLocityY, boolean consumed) {
return mChildHelper.dispatchnestedFling(veLocityX, veLocityY, consumed);
}
@Override
public boolean dispatchnestedPreFling(float veLocityX, float veLocityY) {
return mChildHelper.dispatchnestedPreFling(veLocityX, veLocityY);
}
}
关于CoordinatorLayou eclipse中使用出现的问题和eclipse corrosion的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android CoordinatorLayout 使用、android – CoordinatorLayout与RecyclerView和Collapsing标题、android – 使用AppBarLayout在CoordinatorLayout中滚动显示/隐藏BottomNavigationView、android – 另一个CoordinatorLayout里面的CoordinatorLayout等相关知识的信息别忘了在本站进行查找喔。
最近很多小伙伴都在问JAVA常见面试题之Forward和Redirect的区别和java forward和redirect的区别这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展forward 和 redirect 的区别、forward 和 redirect 的区别???、forward 和redirect、forward 和redirect的不同等相关知识,下面开始了哦!
本文目录一览:- JAVA常见面试题之Forward和Redirect的区别(java forward和redirect的区别)
- forward 和 redirect 的区别
- forward 和 redirect 的区别???
- forward 和redirect
- forward 和redirect的不同
JAVA常见面试题之Forward和Redirect的区别(java forward和redirect的区别)
用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的。根据转发方式的不同,可以区分为直接请求转发(Forward)和间接请求转发(Redirect),那么这两种转发方式有何区别呢?本篇在回答该问题的同时全面的讲解两种请求转发方式的原理和区别。
【出现频率】
【关键考点】
- 请求转发的含义;
- Forward转发请求的原理;
- Redirect转发请求的原理。
【考题分析】
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。
直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
举个通俗的例子:
直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;
间接转发就相当于:"A找B借钱,B说没有,让A去找C借"。
下面详细阐述一下两者的原理:
一:间接请求转发(Redirect)
间接转发方式,有时也叫重定向,它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。在Servlet中,通过调用response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL,示例代码如下:
...... //Servlet中处理get请求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){ //请求重定向到另外的资源
response.sendRedirect("资源的URL"); } ........
上图所示的间接转发请求的过程如下:
- 浏览器向Servlet1发出访问请求;
- Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
- 浏览器向servlet2发出请求;
- 最终由Servlet2做出响应。
二:直接请求转发(Forward)
直接转发方式用的更多一些,一般说的请求转发指的就是直接转发方式。Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。
javax.serlvet.RequestDispatcher接口是请求转发器必须实现的接口,由Web容器为Servlet提供实现该接口的对象,通过调用该接口的forward()方法到达请求转发的目的,示例代码如下:
...... //Servlet里处理get请求的方法
public void doGet(HttpServletRequest request , HttpServletResponse response){ //获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置
RequestDispatcher requestDispatcher =request.getRequestDispatcher("资源的URL"); //调用forward()方法,转发请求 requestDispatcher.forward(request,response); }
......
上图所示的直接转发请求的过程如下:
- 浏览器向Servlet1发出访问请求;
- Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
- 最终由Servlet2做出响应。
技巧:其实,通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单击某一个超链接时,浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是间接的请求转发。相反,如果地址没有发生变化,则代表的是直接请求转发或者没有转发。
问:直接转发和间接转发的原理及区别是什么?
答:Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。
对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。
对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。
最后,祝大家都能找到一个称心满意的工作!
forward 和 redirect 的区别
解释一
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送 http 请求 ----》web 服务器接受此请求 --》调用内部的一个方法在容器内部完成请求处理和转发动作 ----》将目标资源发送给客户;在这里,转发的路径必须是同一个 web 容器下的 url,其不能转向到其他的 web 路径上去,中间传递的是自己的容器内的 request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送 http 请求 ----》web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器 --》客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 url 是新的 location 地址 ----》服务器根据此请求寻找资源并发送给客户。在这里 location 可以重定向到任意 URL,既然是浏览器重新发出了请求,则就没有什么 request 传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次 request,
第一次,客户端 request A, 服务器响应,并 response 回来,告诉浏览器,你应该去 B。这个时候 IE 可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己 web 应用以外的资源。在重定向的过程中,传输的信息会被丢失。
例子:
请求转发是服务器内部把对一个 request/response 的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个 A,而不知道中间的 B,甚至 C、D。 传输的信息不会丢失。
例子:
解释三
假设你去办理某个执照,
重定向:你先去了 A 局,A 局的人说:“这个事情不归我们管,去 B 局”,然后,你就从 A 退了出来,自己乘车去了 B 局。
转发:你先去了 A 局,A 局看了以后,知道这个事情其实应该 B 局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了 B 的人,让他们办好后,送了过来。
forward 和 redirect 的区别???
* forward --> 直接转发 --> 客户端 只发出一次请求 --> 就可以 得到 想要的资源
A --> B 借钱 , B没有钱, B 去找 C借钱 , 不管有没有借到 都会告知 A的
* redirect --》 间接转发 --> 客户端 需要发出 两次请求
A --> B 借钱, B 没有钱, B 让 A 去找 C 借.
forward 和redirect
1. forward方法使用
dispatcher方法,path必须是相对路径。
getRequestdispatcher
getRequestDispatcher( path)
- Returns a RequestDispatcher object that acts as a wrapper for the resource located at the given path. A
Requestdispatcher
object can be used to forward a request to the resource or to include the resource in a response. The resource can be dynamic or static.The pathname specified may be relative,although it cannot extend outside the current servlet context. If the path begins with a "/" it is interpreted as relative to the current context root. This method returns
null
if the servlet container cannot return aRequestdispatcher
.The difference between this method and ServletContext.getRequestDispatcher(java.lang.String) is that this method can take a relative path.
- Parameters:
-
path
- aString
specifying the pathname to the resource. If it is relative,it must be relative against the current servlet. - Returns:
- a
Requestdispatcher
object that acts as a wrapper for the resource at the specified path,ornull
if the servlet container cannot return aRequestdispatcher
- See Also:
-
RequestDispatcher,
接着forward方法,
forward
void forward( request, response) throws ,
- Forwards a request from a servlet to another resource (servlet,JSP file,or HTML file) on the server. This method allows one servlet to do preliminary processing of a request and another resource to generate the response.
For a
RequestDispatcher
obtained viagetRequestDispatcher()
,theServletRequest
object has its path elements and parameters adjusted to match the path of the target resource.forward
should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed,this method throws anIllegalStateException
. Uncommitted output in the response buffer is automatically cleared before the forward.The request and response parameters must be either the same objects as were passed to the calling servlet's service method or be subclasses of theServletRequestWrapper or ServletResponseWrapper classes that wrap them.
- Parameters:
-
request
- a ServletRequest object that represents the request the client makes of the servlet -
response
- a ServletResponse object that represents the response the servlet returns to the client - Throws:
-
- if the target resource throws this exception
-
- if the target resource throws this exception
-
- if the response was already committed
2.sendRedirect方法使用
HttpServletResponse中使用sendRedirect可以实现跳转,可以接受相对路径或者绝对路径。
sendRedirect
public void sendRedirect(java.lang.String location) throws java.io.IOException
- Sends a temporary redirect response to the client using the specified redirect location URL. This method can accept relative URLs; the servlet container must convert the relative URL to an absolute URL before sending the response to the client. If the location is relative without a leading '/' the container interprets it as relative to the current request URI. If the location is relative with a leading '/' the container interprets it as relative to the servlet container root.
If the response has already been committed,this method throws an IllegalStateException. After using this method,the response should be considered to be committed and should not be written to.
- 参数
-
定位
- the redirect location URL - Throws:
-
java.io.IOException
- If an input or output exception occurs -
java.lang.IllegalStateException
- If the response was committed or if a partial URL is given and cannot be converted into a valid URL
Servlet 跳转 redirect与forward跳转的区别
Servlet:
当然,在servlet中,一般跳转都发生在doGet,doPost等方法里面。
一、原理
1) redirect 方式
response.sendRedirect("/a.jsp");
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
response.sendRedirect("http://www.ycul.com");
跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html; charset=UTF-8");
response.sendRedirect("/index.jsp");
}
2) forward方式
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher .forward(request,response);
页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
这种方式是在服务器端作的重定向。服务器往client发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html; charset=UTF-8");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request,response);
}
二、区别.
1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找。而forward不能这样处理相对路径。
java
他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
Requestdispatcher.forward则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和response信息发送到下一页面)。由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。
JSP:
1) response.sendRedirect();
和servlet的response.sendRedirect()方式一样。
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳转后浏览器地址栏变化
如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;
如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
2) response.setHeader("Location","");
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化
此语句后面的语句执行完成后才会跳转
3)
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestdispatcherImpl.forward(RequestdispatcherImpl.java:134)
at com.caucho.server.webapp.RequestdispatcherImpl.forward(RequestdispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
...
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
来自:http://wenku.baidu.com/link?url=Z8dLJDFT1MX6-yDqajj71B3rc32Zx79iybgSkMoqg922FApVCTviGuYhflaWUiaMYhcAc-It1pKKq2Y127JCYp41U_y4sNsVpQ8AJ_vaEvS
forward 和redirect的不同
forward: 你出门去买饼和凉菜吃饭,首先来到卖饼的,你说要买饼和凉菜,摊主把饼给你,并说等一会然后去别的地方买了凉菜回来给你,你付钱回家 ok
redirect: 你出门去买饼和凉菜吃饭,首先来到卖饼的,你说要买饼和凉菜,摊主把饼给你,并说我这没凉菜,你去隔壁吧,于是你就去隔壁买凉菜了,然后回家。 ok
这就是forward和redirect的不同。
对于浏览器来说就是 说你发了一次请求 浏览器接受请求发现没找到资源,然后去别的地方取得资源返回给你,就是forward
你发了一次请求,浏览器接受请求发现没有资源,就说你访问这个地址看看,于是你的浏览器就又发起了一次请求然后得到了资源。这就是redirect
关于JAVA常见面试题之Forward和Redirect的区别和java forward和redirect的区别的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于forward 和 redirect 的区别、forward 和 redirect 的区别???、forward 和redirect、forward 和redirect的不同的相关信息,请在本站寻找。
想了解真机测试遇到问题code signing is required for product type ''xxxxx'' in SDK ''iOS 8.2''的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于Aborting commit: ''XXXXXXXX''remains in conflict错误、access violation xxxx in module xxxx : in address xxx、BeanNotOfRequiredTypeException:Bean named ''XXXX'' is expected to be of type ''XXX'' ...、C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).的新知识。
本文目录一览:- 真机测试遇到问题code signing is required for product type ''xxxxx'' in SDK ''iOS 8.2''
- Aborting commit: ''XXXXXXXX''remains in conflict错误
- access violation xxxx in module xxxx : in address xxx
- BeanNotOfRequiredTypeException:Bean named ''XXXX'' is expected to be of type ''XXX'' ...
- C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
真机测试遇到问题code signing is required for product type ''xxxxx'' in SDK ''iOS 8.2''
- 找UDID,打开iTunes,找到一个小手机图标,点击序列号,就会出现UDID;
- Targets--General--Singing--Acount里添加自己的appleid
Aborting commit: ''XXXXXXXX''remains in conflict错误
今天在提交项目文件到本地SVN时提示错误如下:
过期:”global.php“在事务”21-1“,
You have to update your working copy first.
运行update更新后再次提交又出现如下错误:
svn: Commit failed (details follow):svn: Aborting commit: ''global.php'' remains in conflict查了一下SVN的手册才知道原来是多个版本之间遇到冲突。此时你需要解决冲突(合并别人的修改)。
--------------------------------------------------------------------------------
举一个例子,Sally修改了sandwich.txt,Harry刚刚改变了他的本地拷贝中的这个文件并且提交到服务器,Sally在提交之前更新它的工作拷贝得到了冲突:
$ svn update C sandwich.txt Updated to revision 2. $ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2
在这种情况下,Subversion不会允许你提交sandwich.txt,直到你的三个临时文件被删掉。
$ svn commit --message "Add a few more things" svn: Commit failed (details follow): svn: Aborting commit: ''/home/sally/svn-work/sandwich.txt'' remains in conflict
如果你遇到冲突,三件事你可以选择:
“手动”合并冲突文本(检查和修改文件中的冲突标志)。
用某一个临时文件覆盖你的工作文件。
运行svn revert <filename>来放弃所有的修改。
一旦你解决了冲突,你需要通过命令svn resolved让Subversion知道,这样就会删除三个临时文件,Subversion就不会认为这个文件是在冲突状态了。
$ svn resolved sandwich.txt Resolved conflicted state of ''sandwich.txt''
手工合并冲突
第一次尝试解决冲突让人感觉很害怕,但经过一点训练,它简单的像是骑着车子下坡。
这里一个简单的例子,由于不良的交流,你和同事Sally,同时编辑了sandwich.txt。Sally提交了修改,当你准备更新你的版本,冲突发生了,我们不得不去修改sandwich.txt来解决这个问题。首先,看一下这个文件:
$ cat sandwich.txtTop piece of breadMayonnaiseLettuceTomatoProvolone<<<<<<< .mineSalamiMortadellaProsciutto=======SauerkrautGrilled Chicken>>>>>>> .r2Creole MustardBottom piece of bread小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除,前两组标志中间的内容是你在冲突区所做 的修改:
<<<<<<< .mineSalamiMortadellaProsciutto=======后两组之间的是Sally提交的修改冲突:
=======SauerkrautGrilled Chicken>>>>>>> .r2通常你并不希望只是删除冲突标志和Sally的修改—当她收到三明治时,会非常的吃惊。所以你应该走到她的办公室或是拿起电话告诉Sally,你没 办法从从意大利熟食店得到想要的泡菜。一旦你们确认了提交内容后,修改文件并且删除冲突标志。
Top piece of breadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreole MustardBottom piece of bread现在运行svn resolved,你已经准备好提交了:
$ svn resolved sandwich.txt$ svn commit -m "Go ahead and use my sandwich, discarding Sally''s edits."记住,如果你修改冲突时感到混乱,你可以参考subversion生成的三个文件—包括你未作更新的文件。你也可以使用第三方的合并工具检 验这三个文件。
拷贝覆盖你的工作文件
如果你只是希望取消你的修改,你可以仅仅拷贝Subversion为你生成的文件替换你的工作拷贝:
$ svn updateC sandwich.txtUpdated to revision 2.$ ls sandwich.*sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1$ cp sandwich.txt.r2 sandwich.txt$ svn resolved sandwich.txt下注:使用svn revert
如果你得到冲突,经过检查你决定取消自己的修改并且重新编辑,你可以恢复你的修改:
$ svn revert sandwich.txtReverted ''sandwich.txt''$ ls sandwich.*sandwich.txt注意,当你恢复一个冲突的文件时,不需要再运行svn resolved。
现在我们准备好提交修改了,注意svn resolved不像我们本章学过的其他命令一样需要参数,在任何你认为解决了冲突的时候,只需要小心运行svn resolved,—一旦删除了临时文件,Subversion会让你提交这文件,即使文件中还存在冲突标记。
提交你得修改
最后!你的修改结束了,你合并了服务器上所有的修改,你准备好提交修改到版本库。
svn commit命令发送所有的修改到版本库,当你提交修改时,你需要提供一些描述修改的日志信息,你的信息会附到这个修订版本上,如果信息很简短,你可以在命令行中使用--message(-m)选项:
$ svn commit --message "Corrected number of cheese slices." Sending sandwich.txt Transmitting file data . Committed revision 3.
然而,如果你把写日志信息当作工作的一部分,你也许会希望通过告诉Subversion一个文件名得到日志信息,使用--file选项:
$ svn commit --file logmsg Sending sandwich.txt Transmitting file data . Committed revision 4.
如果你没有指定--message或者--file选项,Subversion会自动地启动你最喜欢的编辑器来编辑日志信息。
版本库不知道也不关心你的修改作为一个整体是否有意义,它只检查是否有其他人修改了同一个文件,如果别人已经这样做了,你的整个提交会失败,并且提示你一个或多个文件已经过时了:
$ svn commit --message "Add another rule" Sending rules.txt svn: Commit failed (details follow): svn: Out of date: ''rules.txt'' in transaction ''g''
此刻,你需要运行svn update来处理所有的合并和冲突,然后再尝试提交。
我们已经覆盖了Subversion基本的工作周期,还有许多其它特性可以管理你得版本库和工作拷贝,但是只使用前面介绍的命令你就可以很轻松的工作了。
access violation xxxx in module xxxx : in address xxx
Oracle组件,PLSQL登陆等出现错误:
Oracle组件,PLSQL登陆等出现错误: access violation xxxx in module xxxxxx :in address xxxx
google查询后提示属于数据执行保护的问题。
windows 7下。
解决办法:开始->计算机(右键)->属性->高级系统设置->高级-(性能)设置-数据执行保护->在为除下列选定xxxxx中添加
PLSQL等出现问题的程序。应用,确定,重启。
如果还是出现问题:
使用管理员身份运行cmd.exe,进入后使用命令 bcdedit 查看相关设置。
如果最后一项 nx 的状态为 Always off,则使用 bcdedit /set nx OptOut.然后重启程序。
BeanNotOfRequiredTypeException:Bean named ''XXXX'' is expected to be of type ''XXX'' ...
直接说结论,前提是在服务实现层启用了 @Transactional(rollbackFor = Exception.class) 注解,然后 controller 层注入的服务应该是接口,但是不知道哪个傻吊注入了实现。详细看后面。
今天测试项目的时候一直报错,找这个错误花费了两三个小时,错误来源于粗心大意,注入的接口弄错了,但不是我弄错了,是公司的其他同事,协作开发。
由于昨天开发、测试一切正常,但是我新写的代码,启动就报错,最开始我百度,基本都是告诉我注入 bean 错误,name 有问题,重名等等,但是我仔细核查都没问题。
后来我一点点的添加自己的代码,测试,发现当我的服务层 Server 方法加上 @Transactional(rollbackFor = Exception.class) 注解,启动就报 RT 错误,这我纳闷了,然后慢慢看注入 bean 的 name 看是否重名,没有,编译也不报错,但我看到这个的时候,简直爆炸。如下图。
当时就想骂人了,谁这么注解的,浪费我时间,难怪会报错,至于深层原因,技术水平时间有限,我也不知道 Orz。
如果有类似错误,但是不是 bean 的 name 等错误,可以看看是不是这个原因。
附完整错误代码:
六月 23, 2019 6:55:08 下午 org.apache.catalina.core.ApplicationContext log
严重: StandardWrapper.Throwable
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ''noticeController'': Unsatisfied dependency expressed through field ''nts''; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ''noticeService'' is expected to be of type ''service.NoticeService'' but was actually of type ''com.sun.proxy.$Proxy211''
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:171)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4901)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5188)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ''noticeService'' is expected to be of type ''service.NoticeService'' but was actually of type ''com.sun.proxy.$Proxy211''
at org.springframework.beans.factory.support.DefaultListableBeanFactory.checkBeanNotOfRequiredType(DefaultListableBeanFactory.java:1510)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.checkBeanNotOfRequiredType(DefaultListableBeanFactory.java:1517)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1489)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 31 more
六月 23, 2019 6:55:09 下午 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet [spring] in web application [/mainWeb] threw load() exception
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ''noticeService'' is expected to be of type ''.service.NoticeService'' but was actually of type ''com.sun.proxy.$Proxy211''
at org.springframework.beans.factory.support.DefaultListableBeanFactory.checkBeanNotOfRequiredType(DefaultListableBeanFactory.java:1510)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.checkBeanNotOfRequiredType(DefaultListableBeanFactory.java:1517)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1489)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:171)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4901)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5188)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
一、问题描述
在做C# 的 Guid 转换时,出现这个问题:Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). 中文翻译是:guid应包含32位数字和4个破折号(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX)。
二、解决方案
看我们转换的字符串是否满足这个条件:guid应包含32位数字和4个破折号(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX),不满足修改满足即可!
三、案例
我在转换的时候,由于我需要转换的字符串,不满足guid的规则,才出现这个错误。
仔细观察,我需要转换的字符串,根本就不满足 guid 的特点,当我把 ar 中的 “ " ” 号去掉就可以了。
OK,转换完成!
---------------修改2019年05月09日---------------------
因为我的 DataId 本来就是一个Json 字符串,所以没有必要去使用 Replace() 、Split(),直接使用 JsonConvert 操作多好,所以我改为:
var items = JsonConvert.DeserializeObject<List<Guid>>(_recordBookRepository.Get(input.RecordBookId).DataId);
让专业的方法,处理专业的事情,是否是最优解。
---------------修改2019年05月23日---------------------
判断 Guid 是否为空。
传入的参数:
/// <summary>
/// id
/// </summary>
public Guid? StatGroupId { get; set; }
判断是否为空:
var boolStatGroup = input.StatGroupId.HasValue && input.StatGroupId != Guid.Empty;
我们今天的关于真机测试遇到问题code signing is required for product type ''xxxxx'' in SDK ''iOS 8.2''的分享已经告一段落,感谢您的关注,如果您想了解更多关于Aborting commit: ''XXXXXXXX''remains in conflict错误、access violation xxxx in module xxxx : in address xxx、BeanNotOfRequiredTypeException:Bean named ''XXXX'' is expected to be of type ''XXX'' ...、C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).的相关信息,请在本站查询。
本文标签: