C++实现String类遇到的问题

环境是VS2015,想自己动手实现String类,主要代码如下:
Str.h :

 #ifndef STR_H
#define STR_H

#include <iostream>
using namespace std;

class Str {

private:
    char* m_data;

public:

    friend ostream& operator << (ostream& os, const Str& str);

    char* get_pointer() const {
        return m_data;
    }

    // 构造函数
    Str(const char* cstr = 0);

    // 拷贝构造
    Str(const Str& str);

    // 拷贝赋值
    Str& operator = (const Str& str);

    // 析构函数
    ~Str();
};

#endif // !STR_H

Str.cpp :

 #include "Str.h"
#include <cstring>

Str::Str(const char* cstr) {
    if (cstr) {
        m_data = new char[strlen(cstr) + 1];
        strcpy_s(m_data, 40, cstr);
    }
    else {
        m_data = new char[1];
        *m_data = '\0';
    }
}

Str::Str(const Str& str) {
    m_data = new char[strlen(str.m_data) + 1];
    strcpy_s(m_data, 40, str.m_data);
}

Str::~Str() {
    delete[] m_data;
}

// 拷贝赋值
Str& Str::operator = (const Str& str) {
    if (this == &str) {
        return *this;
    }
    delete[] m_data;
    m_data = new char[strlen(str.m_data) + 1];
    strcpy_s(m_data, 40, str.m_data);
    return *this;
}

ostream& operator << (ostream& os, const Str& str) {
    os << str.m_data;
    return os;
}

没加入 << 重载时,main函数中新建对象没有错误。加入 << 重载后,新建Str对象程序就会崩溃。求各路大神给个解答

5个回答

运行了下,没毛病哇???

a19990412
肥宅_Sean 回复ListerCi: 那真的是有趣了(苦笑)
2 年多之前 回复
ListerCi
ListerCi 被VS坑了
2 年多之前 回复

格式是不是有错误,感觉你的格式有问题

1.首先<<的原型和实现是没有问题的, 把你的main程序发出来看看

一般这种问题都是指针错误,能把main函数发出来吗?

一般问题都是出在指针上,能把main函数发出来吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++实现String类遇到的问题
环境是VS2015,想自己动手实现String类,主要代码如下: Str.h : ``` #ifndef STR_H #define STR_H #include <iostream> using namespace std; class Str { private: char* m_data; public: friend ostream& operator << (ostream& os, const Str& str); char* get_pointer() const { return m_data; } // 构造函数 Str(const char* cstr = 0); // 拷贝构造 Str(const Str& str); // 拷贝赋值 Str& operator = (const Str& str); // 析构函数 ~Str(); }; #endif // !STR_H ``` Str.cpp : ``` #include "Str.h" #include <cstring> Str::Str(const char* cstr) { if (cstr) { m_data = new char[strlen(cstr) + 1]; strcpy_s(m_data, 40, cstr); } else { m_data = new char[1]; *m_data = '\0'; } } Str::Str(const Str& str) { m_data = new char[strlen(str.m_data) + 1]; strcpy_s(m_data, 40, str.m_data); } Str::~Str() { delete[] m_data; } // 拷贝赋值 Str& Str::operator = (const Str& str) { if (this == &str) { return *this; } delete[] m_data; m_data = new char[strlen(str.m_data) + 1]; strcpy_s(m_data, 40, str.m_data); return *this; } ostream& operator << (ostream& os, const Str& str) { os << str.m_data; return os; } ``` 没加入 << 重载时,main函数中新建对象没有错误。加入 << 重载后,新建Str对象程序就会崩溃。求各路大神给个解答
用 ApplyResources(object value, string objectName)实现C#多语言界面遇到的问题?
最近在做基于xml文件实现C#多语言界面的小工具,思路是想通过重写ComponentResourceManager的ApplyResources方法。 首先是采用XML文件存储系统控件语言版本信息,切换语言时候就读出内容,通过遍历form,传递每一个控件的信息给ApplyResources,但是不成功。想问:是否ApplyResources一定要和Form1.zh-CN.resx等资源文件配合使用呢?是不是ApplyResources方法的实现就是通过读取Form1.zh-CN.resx里面的内容,然后为控件赋值呢?
C#中如何构造一个兼容多种参数类型的类用以传递不同类型的消息?
大家好!设有一个类Hero,现在需在多个不同的Hero实例之间传递消息,为此我的实现方式是:为Hero实现1个专门接收消息的方法OnMessage(),并定义1个专门携带消息的类Telegram。当A要向B发送消息时,把消息内容写在Telegram中,并调用B.OnMessage(Telegram)进行消息传递。 **现在遇到的困难是:当可能发送的消息内容包含多种变量类型(例如,可能是int、string、List<string>、string数组等)时,如何编写代码使得程序更简洁?** 具体请看我目前的实现(代码不够简洁): 1、首先在Hero类中,增加专门接收并处理消息的方法OnMessage() ``` class Hero() { public void OnMessage(Telegram t)//t携带了具体的消息,详见下文 { //t.index标识了应该调用哪个方法处理这条消息,例如: switch(t.index) { case 1: //方法1 case 2: //方法2 } } } ``` 2、其次,定义1个结构体Telegram,专门用来携带具体消息内容,它有2个成员变量:index(标识应调用哪个方法处理本消息)和info(携带具体消息内容) ``` struct Telegram { public int index;//用来标识应调用哪个方法处理本消息,每个index都对应着Hero类中一个具体的处理方法 //注:由于不同的方法对应的参数类型是不同的,例如,方法1的参数是int、方法2的参数是string、方法3的参数是string数组……,所以我的实现方式比较繁琐,如下 public int info_int;//当这条消息打算发给方法1进行处理时,把消息内容赋值给这个变量,其他的info变量不赋值 public string info_string;//当这条消息打算发给方法2进行处理时,把消息内容赋值给这个变量,其他的info变量不赋值 public string[] info_stringArray;//当这条消息打算发给方法3进行处理时,把消息内容赋值给这个变量,其他的info变量不赋值 } ``` 3、因此,OnMessage()的内容实际上是这样的: ``` class Hero() { public void OnMessage(Telegram t) { switch(t.index) { case 1://调用方法1,且参数类型为int func1(t.info_int); break; case 2://调用方法2,且参数类型为string func2(t.info_string); break; case 3://调用方法3,且参数类型为string数组 func3(t.info_stringArray); break; default: } } } ``` **情况描述完毕了,主要想请教的就是:以上Telegram中几个不同的info变量,能否统一成1个变量?** ``` //期望能做到这样的效果: class Hero() { public void OnMessage(Telegram t) { switch(t.index) { case 1: func1(t.info);//该方法的输入参数为int,而且会把t.info当做int进行处理 break; case 2: func2(t.info);//该方法的输入参数为string,而且会把t.info当做string进行处理 break; case 3: func3(t.info);//该方法的输入参数为string数组,而且会把t.info当做string数组进行处理 break; default: } } } ``` 对了,截至目前为止我尝试的思路有以下几种,在此列出也是希望大家能帮忙指点一下(尤其是思路2和思路3是否可行),十分感谢: 1、将info定义为Object,赋值、传参时全部以Object进行操作。但存在问题是:反复的装箱、拆箱操作影响效率(程序运行时消息传递非常频繁)。因此该方案放弃了。 2、将info定义为自定义格式文本或json,传参之后再自行解析。但这块我还没有深入学习,此外担心json转换过程中是否存在类似于Object装箱拆箱影响效率的问题? 3、利用C#的泛型。但这块我学习的也不足,目前的尝试仍然失败了,如下所示 (3.1)定义1个泛型类MsgInfo<T> ``` public class MsgInfo<T> { public T obj; public MsgInfo(T objInput) { this.obj = objInput; } } ``` (3.2)在Telegram中使用它,结果出错了 ``` struct Telegram { public int index; public MsgInfo<T> info;//注:此处是会报错的,因为泛型类在实例化时必须制定变量类型,因此这里是不能写T的,只能写int、string等等 } ``` 由于没有余额了,无法发起悬赏,非常抱歉~
C#调用C++ Dll 返回信息与C++返回结构体中信息不一致?
各位大佬,小弟遇到一个很难理解的问题,情况如下: C++ 开发的Dll和硬件通讯,在C++中使用返回正常的数值,而在C#中通过DllImport方式调用,发现返回的数值不一致,具体代码如下: ** C++ 提供的结构体:** ``` typedef struct _SXPSERVER { BYTE bNodeaddr[6]; DWORD dwIp; char szMachineType[16]; char szHostName[16]; } SXPSERVER, *LPSXPSERVER; ``` ![图片说明](https://img-ask.csdn.net/upload/202003/09/1583717423_841994.png) **C# 自己写的DllImport 的结构体** ``` [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SXPSERVER { public uint dwIp; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)] public byte[] bNodeaddr; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szMachineType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szHostName; } ``` ![图片说明](https://img-ask.csdn.net/upload/202003/09/1583717435_345718.png) 调用全部都一切正常,结构体中也能够返回值,现在就是这个DWORD dwIp; 转换到C#中的 public uint dwIp;返回不一样,其他的都没有问题,请问各位大佬,我这个转换不对吗?查了半天看到的对应转换关系都是DWORD -》uint,我改成了int同样也是不对,这个咋整,这个值还会是后面的函数中的关键参数,卡到这里进行不下去了。 PS:看到有大神留言说这个参数位置写反了,我最开始的时候就是按照这个顺序( ``` [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SXPSERVER { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)] public byte[] bNodeaddr; public uint dwIp; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szMachineType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szHostName; } ``` )来的,出来的结果和这个是一样的 **问题已经解决了,解决的方式是这样的:** 我在C++的结构体与C#定义的结构体的顺序是不一样的,但这个不是主要的原因。而是我调用方式有问题。我把c#实现的这个结构体单独放到了一个DLL中,然后再通过别的工程去调用这个DLL,这样的话。不管结构体中的顺序是什么,它都能够调用成功,但是他成功之后,里面的数值是不对的,这个是我通过反编译看到的,所有的结构体变量约束都没有了,所以这个值肯定不对啦。而我把这个调用C++的这个结构体直接放到了我现在用的工程当中,按照错误的顺序,这个方法都不会调用成功,而按照正确的顺序后就ok啦!
MyDate类编写时遇到了问题
Mydate类里要求实现before和after函数,具体问题是 ``` public MyDate after(int n){ MyDate e=new MyDate(c.get(Calendar.YEAR),c.get(Calendar.MONTH)-1,c.get(Calendar.DAY_OF_MONTH) ); e.c.add(Calendar.DAY_OF_MONTH, n); return e; } ``` 在编写这个函数时,不知道是不是这个函数用了Calendar的get方法让我后面的测试出现了编译错误 public class Main { public static void main(String[] args) { int selected; Scanner in=new Scanner(System.in); selected=in.nextInt(); MyDate md=new MyDate(2000,10,10); switch(selected){ case 1: System.out.println(md); break; case 2: md=new MyDate("2010-10-10"); System.out.println(md); break; case 3: md=new MyDate("2010/10/10","yyyy/MM/dd"); System.out.println(md); break; case 4: System.out.println(md.after(8)); break; case 5: System.out.println(md.before(20)); break; case 6: System.out.println(md.getCalender().get(Calendar.YEAR)); break; case 7: md.setPattern("yyyy/MM/dd"); System.out.println(md); } in.close(); } } 这个是题目的主函数 MyDate类的代码如下: ``` public class MyDate{ private Calendar c=Calendar.getInstance(); private String Pattern="yyyy-MM-dd"; public MyDate() { super(); } public MyDate(int y,int m,int d) { c.set(Calendar.YEAR, y); c.set(Calendar.MONTH, m); c.set(Calendar.DAY_OF_MONTH, d); } public MyDate(String source) { SimpleDateFormat sdf=new SimpleDateFormat(Pattern); try { c.setTime(sdf.parse(source)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public MyDate(String source,String Pattern) { this.Pattern=Pattern; SimpleDateFormat sdf=new SimpleDateFormat(Pattern); try { c.setTime(sdf.parse(source)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public MyDate after(int n){ MyDate e=new MyDate(c.getInstance().YEAR,c.getInstance().MONTH,c.getInstance().DATE ); e.c.add(Calendar.DAY_OF_MONTH, n); return e; } public MyDate before(int n){ MyDate e=new MyDate(c.get(Calendar.YEAR),c.get(Calendar.MONTH)-1,c.get(Calendar.DAY_OF_MONTH)); e.c.add(Calendar.DAY_OF_MONTH,-n); return e; } public Date getDate(){ return c.getTime(); } public Calendar getCalender(){ return c; } public long getLong(){ return c.getTimeInMillis(); } public void setPattern(String pattern) { this.Pattern = pattern; } @Override public String toString() { SimpleDateFormat sdf=new SimpleDateFormat(Pattern); return sdf.format(c.getTime()); } } ``` 想知道为什么会出现编译错误,望大佬帮忙指点 我尝试把getCalendar改成getInstance之后,输出就不对了
javascript string.format效率问题
Extjs在机器较差的系统上的性能真是个问题,现在的业务大概是这样的: 有一个编辑表格,当我编辑一个单元格时,需要影响到其他几个单元格,以及统计行信息。 这个操作在机器较差的IE7、IE8下执行时间竟然差不多10s左右,firefox和chrome没有问题,基本上2-3s。 请看截图: [img]http://dl.iteye.com/upload/attachment/562661/f7cdd017-1d98-33e4-a0d0-f41c18bb1d2b.jpg[/img] 使用IE自带的探查器分析了下,发现主要就是这个string.format执行了太长的时间。 其实现如下: [code="java"] format : function(format){ var args = Ext.toArray(arguments, 1); return format.replace(/\{(\d+)\}/g, function(m, i){ return args[i]; }); } [/code] 网上查询了下,确实是有存在性能问题。 主要参考:http://blog.csdn.net/hax/article/details/1416692 他提供的这个确实看不懂。同时我们的替代符是{1}、{2}这样的,也有点不一样。 不知道有谁遇到相关的问题没有,能否提供点建议。
c#控制摄像头实现录像及视频压缩时遇到的问题
本人通过c#调用了avicap32.dll实现对摄像头的控制,包括了在窗体中显示实时图像,截图,录像等功能。但是遇到几个问题 1.实时显示图像时,图像时清晰的,但是进行录像时,实时显示的图像变成很多噪点,奇怪的是得到的录像视频文件中图像时清晰的。![图片说明](https://img-ask.csdn.net/upload/201607/18/1468818135_355771.png) ![图片说明](https://img-ask.csdn.net/upload/201607/18/1468818191_870261.png) 2.录制的视频文件过大,需要进行压缩,想调用xvidcore.dll中的函数进行压缩,可是提示无法找到函数入口点。dll的函数说明是BITMAPINFO infodes; AviCreateFile("d:\\aaa.avi",&infodes); //BitmapInfo 位图信息 [StructLayout(LayoutKind.Sequential)] public struct BITMAPINFO { public BITMAPINFOHEADER bmiHeader; public int bmiColors; } public struct BITMAPINFOHEADER { public int biSize; public int biWidth; public int biHeight; public short biPlanes; public short biBitCount; public int biCompression; public int biSizeImage; public int biXPelsPerMeter; public int biYPelsPerMeter; public int biClrUsed; public int biClrImportant; } BITMAPINFO bit; [DllImport("xvidcore.dll")] public static extern bool AviCreateFile(string path, ref BITMAPINFO lParam); AviCreateFile("d://" + System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi", ref bit);
这是一个有关于C++的问题,作业中遇到的问题,求助!
read one string from the file called "infile.txt" into your string class using your read member function() The class will store the string in dynamic memory that is pointed to with the pointer. When you first create an MYString object you should allocate 20 spaces of memory (using the new command). The string will be stored as a cstring in this memory. 我需要用到这个函数 read( istream & istr) : bool ,并且要在.cpp文件中实现,请问我应怎样完成这个操作?
C#调用c++的dll执行带字符串参数的函数时遇到的问题
我在c++项目中实现函数: extern "C" __declspec(dllexport) int FUNC1(const char* xmlSta, char* fileOut) { return 0; } 然后编译成动态库a.dll,并在C#项目中引用, 用静态加载的方式,是可以运行的,代码如下(只写调用的部分): [DllImport("a.dll", EntryPoint = "FUNC1", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] public static extern int FUNC1(string xmlSta, StringBuilder fileOut); StringBuilder sbr = new StringBuilder(10); int r1 = FUNC1("abc ", sbr); //可以运行! 但是用动态加载的方式,却报错,代码如下: public static class NativeMethod { [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")] public static extern int LoadLibrary( [MarshalAs(UnmanagedType.LPStr)] string lpLibFileName); [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")] public static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName); [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")] public static extern bool FreeLibrary(int hModule); } /// <summary> /// 函数指针 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> delegate int FUNC1(string xmlSta, StringBuilder fileOut); class Program { static void Main(string[] args) { StringBuilder sbr = new StringBuilder(10); //1. 动态加载C++ Dll int hModule = NativeMethod.LoadLibrary(@"a.dll"); if (hModule == 0) return; //2. 读取函数指针 IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "FUNC1"); //3. 将函数指针封装成委托 FUNC1 cFUNC1 = (FUNC1)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(FUNC1)); //4. 测试 Console.WriteLine(cFUNC1("abc ", sbr)); Console.Read(); } } 报错信息是:托管调试助手“PInvokeStackImbalance”在“E:\WCF\CPP\bin\test.vshost.exe”中检测到问题。 其他信息: 对 PInvoke 函数“test!test.FUNC1::Invoke”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。 两种方式不都一样吗?为什么第二种方式会报错?因为第一种方式有时运行很慢,要等很久,所以我想用第二种方式在程序启动时先LoadLibrary,之后就不会出现很慢的情况,但是第二种方式总是出错,只有在参数没有字符串类型的情况下才能运行,但是确实需要传字符串参数,哪位高手能够给个指点,代码该如何修改呢?
Spring AOP 实现类添加增强后,引用实现类的其他类无法创建Bean???
最近刚学Spring AOP,遇到一个问题 是这样的,有两个类A,B ``` public class A{ private B b; ...... } ``` ``` public class B implements C{ private String name; ...... } ``` 我的配置文件里是这样写的 ``` <bean id="b" class="cn.pojo.B" p:name="Jamie"></bean> <bean id="a" class="cn.pojo.A" p:b-ref="b"></bean> ``` 单单这个是没问题的 但是一旦为B类加上增强后(我加的是前置增强和后置增强) 增强代码没问题,单独测试的时候有效果,但是只要一加上创建A的bean的代码时,就会报错,显示无法创建A的bean实例,但是为什么我只要把A类里对B的引用的类型换成接口类型就可以了呢? (就是private C b;) 然后我又测试了一下,干脆不要接口了,直接写,也不报错了,怎么又接口的时候,对于被增强的类的引用,它的类型要写接口类型呢? ``` <bean id="aop1" class="com.duan.AOP1"></bean> <aop:config> <aop:aspect ref="aop1"> <aop:pointcut expression="execution(* com.pojo.*.*(..))" id="rpointer"/> <aop:before method="before" pointcut-ref="rpointer"/> <aop:after method="after" pointcut-ref="rpointer"/> </aop:aspect> </aop:config> ```
C语言实现大数加法(正整数)
杭电OJ1002 输入:输入的第一行包含一个整数T(1<=T<=20),表示测试用例的数量。接下来是T行,每行由两个正整数A和B组成。注意,整数非常大,这意味着您不应该使用32位整数来处理它们。您可以假设每个整数的长度不超过1000。 输出:对于每个测试用例,您应该输出两行。第一行是“Case”,表示测试用例的编号。第二行是方程“A+B=Sum”,Sum表示A+B的结果。注意方程中有一些空格。在两个测试用例之间输出一个空行。 我拿很多种数进行了测试,在VS上都没问题。但是提交就是WRONG..wrong了一天了。下面是代码,各位前辈帮帮忙,给看看。 ``` #include<stdio.h> #include<string.h> #define MAX(a,b) a>b?a:b int main() { int n = 0,i,j,num=0,lengh,lengh_a1,lengh_a2,flag; char a1[1002], a2[1002];//字符数组存大数 scanf("%d", &n); for (j = 0; j < n; j++) { scanf("%s%s", &a1, &a2); lengh_a1 = strlen(a1);//读输入到两个字符数组中的元素个数,用于转换成整形数组 lengh_a2 = strlen(a2); int c1[1002] = { 0 }, c2[1002] = { 0 }, c3[1003] = { 0 };//定义在循环内部,每次都会初始化一次(在外面好像也没遇到错误) for (i = 0; i < lengh_a1; i++) { c1[i] = a1[lengh_a1 - i - 1]-48;//倒着把字符数组的元素输入到整形数组中 } for (i = 0; i < lengh_a2; i++) { c2[i] = a2[lengh_a2 - i - 1]-48; } lengh = MAX(lengh_a1, lengh_a2);//两数组最长的长度 for (i = 0; i <lengh; i++) { flag = 0;//用来看最后一次循环是否进位,在输出的时候用到了 c3[i] = c1[i] + c2[i]+ num;//如果进位,加num num = 0; if (c3[i] >= 10) { c3[i + 1] = 1;//进位,因为这层循环到c3[lengh-1]为止,这样写使c3[lengh]可以获得到进位。 num = 1; c3[i] -= 10; flag = 1; } } num = 0;//防止上一组数的进位Num影响到下一组数 printf("case%d:\n",j+1);//输出 printf("%s + %s = ", a1, a2); for (i = lengh + flag -1; i >= 0; i--) printf("%d", c3[i]); if (j + 1 != n) printf("\n\n"); else printf("\n"); } return 0; } ```
ssm框架demo遇到的问题
各位老哥们大家好,我是一名大二学生,自学Java一年半了,进步很慢,在ssm框架上遇到了问题,认识的人少,这个问题没人指点我,我很难再往后学习。 下面描述一下我遇到的问题吧:我比较抵触写jsp,所以从javaweb开始就尝试前后端分离,在学习ssm框架时,讲师用的都是jsp,我以为只要把springmvc的视图解析器中suffix配置成.html就行了,事情却没那么简单,项目一运行就报404,按理应该默认去找index.html,但是却直接报错,希望老哥们给我分析一下我哪里有错误。希望前辈能指导一下,谢谢了 ## 1:创建项目,我用的是IDEA,创建时选择的是Maven的webapp骨架。 ## 2:导入pom依赖 ``` <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> <name>register</name> <groupId>xyz.peterparker</groupId> <artifactId>register</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.7</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8888</port> <maxIdleTime>30000</maxIdleTime> </connector> </connectors> <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version} </webAppSourceDirectory> <contextPath>/</contextPath> </configuration> </plugin> </plugins> </build> <properties> <spring.version>5.2.1.RELEASE</spring.version> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.12</log4j.version> <mybatis.version>3.4.5</mybatis.version> </properties> <dependencies> <!--dependency> <groupId>xyz.peterparker</groupId> <artifactId>[the artifact id of the block to be mounted]</artifactId> <version>1.0-SNAPSHOT</version> </dependency--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> </dependencies> </project> ``` ## 3:创建包结构 ![图片说明](https://img-ask.csdn.net/upload/202002/19/1582083667_469404.png) ## 4:编写web.xml ``` <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- 更改applicationContext的默认位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!-- 配置前端控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <!-- 配置解决中文乱码的过滤器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app> ``` ## 5:编写applicationContext.xml ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 扫描service和dao --> <context:component-scan base-package="dao" /> <context:component-scan base-package="service" /> <!-- 引入dataSource.properties --> <context:property-placeholder location="classpath:dataSource.properties" /> <!-- 配置数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClass}" /> <property name="jdbcUrl" value="${jdbcUrl}" /> <property name="user" value="${user}" /> <property name="password" value="${password}" /> </bean> <!-- 配置SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置扫描dao --> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="dao" /> </bean> <!-- 配置声明式事务管理 --> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager" /> </beans> ``` ## 6:编写dataSource.properties ``` driverClass=com.mysql.cj.jdbc.Driver jdbcUrl=jdbc:mysql://localhost/user?useSSL=false&serverTimezone=Asia/Shanghai user=root password=rhw19990625 ``` ## 7:编写springmvc.xml ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置扫描controller --> <context:component-scan base-package="controller" /> <!-- 配置视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="pages" /> <property name="suffix" value=".html" /> <property name="contentType" value="text/html" /> </bean> <mvc:annotation-driven /> <mvc:default-servlet-handler /> <aop:aspectj-autoproxy proxy-target-class="true"/> </beans> ``` ## 8:编写User实体类 ``` package domain; import java.io.Serializable; public class User implements Serializable { private String username; private Integer tel; private String password; public User() { } public User(String username, Integer tel, String password) { this.username = username; this.tel = tel; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getTel() { return tel; } public void setTel(Integer tel) { this.tel = tel; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` ## 9:编写dao层接口UserDao ``` package dao; import domain.User; import org.apache.ibatis.annotations.Insert; import org.springframework.stereotype.Repository; @Repository public interface UserDao { @Insert("insert into user values(#{username},#{tel},#{password})") void insert(User user); } ``` ## 10:编写service层接口UserService ``` package service; import domain.User; public interface UserService { void insert(User user); } ``` ## 11:编写service层实现类UserServiceImpl ``` package service.impl; import dao.UserDao; import domain.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import service.UserService; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public void insert(User user) { userDao.insert(user); } } ``` ## 12:编写Controller类UserController ``` package controller; import com.sun.codemodel.internal.JMethod; import domain.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import service.UserService; @Controller @RequestMapping("user") public class UserController { @Autowired private UserService userService; @ResponseBody @RequestMapping(value = "register" ,method = RequestMethod.POST) public String insert(User user){ userService.insert(user); return "success"; } } ``` ## 13:编写index.html ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Register</title> </head> <body> <form action="/user/register" method="post"> <input type="text" name="username"> <input type="text" name="tel"> <input type="password" name="password"> <input type="submit"> </form> </body> </html> ``` ## 14:编写pages文件夹下的success.html ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Success</title> </head> <body> <h3>Success!...</h3> </body> </html> ```
C# http get https://wx.qq.com 总是关闭连接的奇怪问题
最近在做一些微信相关的东西,使用C#遇到了一个非常诡异的问题。 请教大神。共同探讨一下原因。 先贴代码 ``` static void Main(string[] args) { while (true) { HttpGet(); } Console.Read(); } public static string HttpGet() { string html = string.Empty; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://wx.qq.com"); try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream)) { html = reader.ReadToEnd(); reader.Close(); } stream.Flush(); stream.Close(); } response.Close(); } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } finally { request.Abort(); request = null; GC.Collect(); Thread.Sleep(15000); } return html; } ``` 关键的问题就是,连续两次https的keep-alive访问wx.qq.com,如果第二次请求之前sleep15秒钟,那第二次请求一定会报基础连接被关闭的异常。 然后如果打开httpanalyzer或者fidder抓包工具,那就没有这个问题。 stackoverflow有人说fidder相当于一个代理,会有一套自己的http连接池的管理办法。 不知道c#能不能实现类似的功能,或者是我修改某些参数就能解决这个异常。 其实就是实际做了点微信相关的东西,遇到了一些问题,有时候两次发到wx.qq.com的请求中间出现网络问题,间隔一会之后,后面的所有请求都会报错,非常诡异,求大神帮忙解答这个问题,感激不尽
C#连接orcale数据库实现简单的日历模块
//小弟这两天才入职,要写一个简单的日程安排,之前一直用的sqlserver,最近才接触orcale,大致要实现,打开日历加载每天的日程,然后点击日期实现添加修改 //目前遇到的问题是,从数据库中读出来的字段怎么添加到calendar控件中去,然后点击跳转后如何添加 //大致思路有了,但是写了大半天还没写出来,如果有类似demo的能不能发给我参考一下 ``` protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) { //定义连接数据库的字符串 string constring = "Data Source=192.168.27.122/orcl;User ID=cale;Password=cale;Unicode=True"; //进行连接 OracleConnection conn = new OracleConnection(constring); conn.Open();//打开指定的连接 OracleCommand com = conn.CreateCommand(); //执行的Sql语句 string date = "2016-04-1"; com.CommandText = "SELECT PLAN_CONTENT FROM CALE WHERE PLAN_DATE = To_Date('" + date + "','YYYY-MM-DD');"; OracleDataReader reader = com.ExecuteReader(); while (reader.Read()) { Label1.Text =reader.GetString(0); } reader.Close(); conn.Close(); } protected void Calendar1_SelectionChanged(object sender, DayRenderEventArgs e) { CalendarDay d = ((DayRenderEventArgs)e).Day; string id = d.ToString(); Response.Write("<script>window.open('addItem.aspx?id=" + id + "')</script>"); } ```
HTTP Status 500 – Internal Server Error(jspmaker生成,tomcat实现)
内容是用Jspmaker把数据库表生成jsp,然后用tomcat,结果出现了以下问题 网站报错代码如下: HTTP Status 500 – Internal Server ErrorType 异常报告 消息 在 [146] 行处理 [/jspmoon/customerlist.jsp] 时发生异常 描述 服务器遇到一个意外的情况,阻止它完成请求。 Exception org.apache.jasper.JasperException: 在 [146] 行处理 [/jspmoon/customerlist.jsp] 时发生异常 143: // Open Connection to the database 144: try{ 145: Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 146: ResultSet rs = null; 147: // Build SQL 148: String strsql = "SELECT * FROM `customer`"; 149: whereClause = ""; Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:617) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:514) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) Root Cause java.lang.NullPointerException org.apache.jsp.jspmoon.customerlist_jsp._jspService(customerlist_jsp.java:585) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ):注意 主要问题的全部 stack 信息可以在 server logs 里查看 Apache Tomcat/8.5.50 jsp代码: <%@ page session="true" buffer="16kb" import="java.sql.*,java.util.*,java.text.*"%> <%@ page contentType="text/html; charset=UTF-8" %> <% response.setDateHeader("Expires", 0); // date in the past response.addHeader("Cache-Control", "no-store, no-cache, must-revalidate"); // HTTP/1.1 response.addHeader("Cache-Control", "post-check=0, pre-check=0"); response.addHeader("Pragma", "no-cache"); // HTTP/1.0 %> <% Locale locale = Locale.getDefault(); response.setLocale(locale);%> <% session.setMaxInactiveInterval(30*60); %> <%@ include file="db.jsp" %> <%@ include file="jspmkrfn.jsp" %> <% int displayRecs = 20; int recRange = 10; %> <% String tmpfld = null; String escapeString = "\\\\'"; String dbwhere = ""; String masterdetailwhere = ""; String searchwhere = ""; String a_search = ""; String b_search = ""; String whereClause = ""; int startRec = 0, stopRec = 0, totalRecs = 0, recCount = 0; %> <% // Get search criteria for basic search String pSearch = request.getParameter("psearch"); String pSearchType = request.getParameter("psearchtype"); if (pSearch != null && pSearch.length() > 0) { pSearch = pSearch.replaceAll("'",escapeString); if (pSearchType != null && pSearchType.length() > 0) { while (pSearch.indexOf(" ") > 0) { pSearch = pSearch.replaceAll(" ", " "); } String [] arpSearch = pSearch.trim().split(" "); for (int i = 0; i < arpSearch.length; i++){ String kw = arpSearch[i].trim(); b_search = b_search + "("; b_search = b_search + "`C_NAME` LIKE '%" + kw + "%' OR "; b_search = b_search + "`C_ADDRESS` LIKE '%" + kw + "%' OR "; b_search = b_search + "`C_PHONE` LIKE '%" + kw + "%' OR "; b_search = b_search + "`C_MATSEGMENT` LIKE '%" + kw + "%' OR "; b_search = b_search + "`C_COMMENT` LIKE '%" + kw + "%' OR "; if (b_search.substring(b_search.length()-4,b_search.length()).equals(" OR ")) { b_search = b_search.substring(0,b_search.length()-4);} b_search = b_search + ") " + pSearchType + " "; } }else{ b_search = b_search + "`C_NAME` LIKE '%" + pSearch + "%' OR "; b_search = b_search + "`C_ADDRESS` LIKE '%" + pSearch + "%' OR "; b_search = b_search + "`C_PHONE` LIKE '%" + pSearch + "%' OR "; b_search = b_search + "`C_MATSEGMENT` LIKE '%" + pSearch + "%' OR "; b_search = b_search + "`C_COMMENT` LIKE '%" + pSearch + "%' OR "; } } if (b_search.length() > 4 && b_search.substring(b_search.length()-4,b_search.length()).equals(" OR ")) {b_search = b_search.substring(0, b_search.length()-4);} if (b_search.length() > 5 && b_search.substring(b_search.length()-5,b_search.length()).equals(" AND ")) {b_search = b_search.substring(0, b_search.length()-5);} %> <% // Build search criteria if (a_search != null && a_search.length() > 0) { searchwhere = a_search; // Advanced search }else if (b_search != null && b_search.length() > 0) { searchwhere = b_search; // Basic search } // Save search criteria if (searchwhere != null && searchwhere.length() > 0) { session.setAttribute("customer_searchwhere", searchwhere); startRec = 1; // Reset start record counter (new search) session.setAttribute("customer_REC", new Integer(startRec)); }else{ if (session.getAttribute("customer_searchwhere") != null) searchwhere = (String) session.getAttribute("customer_searchwhere"); } %> <% // Get clear search cmd startRec = 0; if (request.getParameter("cmd") != null && request.getParameter("cmd").length() > 0) { String cmd = request.getParameter("cmd"); if (cmd.toUpperCase().equals("RESET")) { searchwhere = ""; // Reset search criteria session.setAttribute("customer_searchwhere", searchwhere); }else if (cmd.toUpperCase().equals("RESETALL")) { searchwhere = ""; // Reset search criteria session.setAttribute("customer_searchwhere", searchwhere); } startRec = 1; // Reset start record counter (reset command) session.setAttribute("customer_REC", new Integer(startRec)); } // Build dbwhere if (masterdetailwhere != null && masterdetailwhere.length() > 0) { dbwhere = dbwhere + "(" + masterdetailwhere + ") AND "; } if (searchwhere != null && searchwhere.length() > 0) { dbwhere = dbwhere + "(" + searchwhere + ") AND "; } if (dbwhere != null && dbwhere.length() > 5) { dbwhere = dbwhere.substring(0, dbwhere.length()-5); // Trim rightmost AND } %> <% // Load Default Order String DefaultOrder = ""; String DefaultOrderType = ""; // No Default Filter String DefaultFilter = ""; // Check for an Order parameter String OrderBy = request.getParameter("order"); if (OrderBy != null && OrderBy.length() > 0) { if (session.getAttribute("customer_OB") != null && ((String) session.getAttribute("customer_OB")).equals(OrderBy)) { // Check if an ASC/DESC toggle is required if (((String) session.getAttribute("customer_OT")).equals("ASC")) { session.setAttribute("customer_OT", "DESC"); }else{ session.setAttribute("customer_OT", "ASC"); } }else{ session.setAttribute("customer_OT", "ASC"); } session.setAttribute("customer_OB", OrderBy); session.setAttribute("customer_REC", new Integer(1)); }else{ OrderBy = (String) session.getAttribute("customer_OB"); if (OrderBy == null || OrderBy.length() == 0) { OrderBy = DefaultOrder; session.setAttribute("customer_OB", OrderBy); session.setAttribute("customer_OT", DefaultOrderType); } } // Open Connection to the database try{ Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = null; // Build SQL String strsql = "SELECT * FROM `customer`"; whereClause = ""; if (DefaultFilter.length() > 0) { whereClause = whereClause + "(" + DefaultFilter + ") AND "; } if (dbwhere.length() > 0) { whereClause = whereClause + "(" + dbwhere + ") AND "; } if (whereClause.length() > 5 && whereClause.substring(whereClause.length()-5, whereClause.length()).equals(" AND ")) { whereClause = whereClause.substring(0, whereClause.length()-5); } if (whereClause.length() > 0) { strsql = strsql + " WHERE " + whereClause; } if (OrderBy != null && OrderBy.length() > 0) { strsql = strsql + " ORDER BY `" + OrderBy + "` " + (String) session.getAttribute("customer_OT"); } //out.println(strsql); rs = stmt.executeQuery(strsql); rs.last(); totalRecs = rs.getRow(); rs.beforeFirst(); startRec = 0; int pageno = 0; // Check for a START parameter if (request.getParameter("start") != null && Integer.parseInt(request.getParameter("start")) > 0) { startRec = Integer.parseInt(request.getParameter("start")); session.setAttribute("customer_REC", new Integer(startRec)); }else if (request.getParameter("pageno") != null && Integer.parseInt(request.getParameter("pageno")) > 0) { pageno = Integer.parseInt(request.getParameter("pageno")); if (IsNumeric(request.getParameter("pageno"))) { startRec = (pageno-1)*displayRecs+1; if (startRec <= 0) { startRec = 1; }else if (startRec >= ((totalRecs-1)/displayRecs)*displayRecs+1) { startRec = ((totalRecs-1)/displayRecs)*displayRecs+1; } session.setAttribute("customer_REC", new Integer(startRec)); }else { startRec = ((Integer) session.getAttribute("customer_REC")).intValue(); if (startRec <= 0) { startRec = 1; // Reset start record counter session.setAttribute("customer_REC", new Integer(startRec)); } } }else{ if (session.getAttribute("customer_REC") != null) startRec = ((Integer) session.getAttribute("customer_REC")).intValue(); if (startRec==0) { startRec = 1; //Reset start record counter session.setAttribute("customer_REC", new Integer(startRec)); } } %> <%@ include file="header.jsp" %> <p><span class="jspmaker">TABLE: customer</span></p> <form action="customerlist.jsp"> <table border="0" cellspacing="0" cellpadding="4"> <tr> <td><span class="jspmaker">Quick Search (*)</span></td> <td><span class="jspmaker"> <input type="text" name="psearch" size="20"> <input type="Submit" name="Submit" value="GO"> &nbsp;&nbsp;<a href="customerlist.jsp?cmd=reset">Show all</a> </span></td> </tr> <tr><td>&nbsp;</td><td><span class="jspmaker"><input type="radio" name="psearchtype" value="" checked>Exact phrase&nbsp;&nbsp;<input type="radio" name="psearchtype" value="AND">All words&nbsp;&nbsp;<input type="radio" name="psearchtype" value="OR">Any word</span></td></tr> </table> </form> <form method="post"> <table border="0" cellspacing="1" cellpadding="4" bgcolor="#CCCCCC"> <tr bgcolor="#594FBF"> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_CUSTKEY","UTF-8") %>" style="color: #FFFFFF;">C CUSTKEY&nbsp;<% if (OrderBy != null && OrderBy.equals("C_CUSTKEY")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_NAME","UTF-8") %>" style="color: #FFFFFF;">C NAME&nbsp;(*)<% if (OrderBy != null && OrderBy.equals("C_NAME")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_ADDRESS","UTF-8") %>" style="color: #FFFFFF;">C ADDRESS&nbsp;(*)<% if (OrderBy != null && OrderBy.equals("C_ADDRESS")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_NATIONKEY","UTF-8") %>" style="color: #FFFFFF;">C NATIONKEY&nbsp;<% if (OrderBy != null && OrderBy.equals("C_NATIONKEY")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_PHONE","UTF-8") %>" style="color: #FFFFFF;">C PHONE&nbsp;(*)<% if (OrderBy != null && OrderBy.equals("C_PHONE")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_ACCTBAL","UTF-8") %>" style="color: #FFFFFF;">C ACCTBAL&nbsp;<% if (OrderBy != null && OrderBy.equals("C_ACCTBAL")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_MATSEGMENT","UTF-8") %>" style="color: #FFFFFF;">C MATSEGMENT&nbsp;(*)<% if (OrderBy != null && OrderBy.equals("C_MATSEGMENT")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td><span class="jspmaker" style="color: #FFFFFF;"> <a href="customerlist.jsp?order=<%= java.net.URLEncoder.encode("C_COMMENT","UTF-8") %>" style="color: #FFFFFF;">C COMMENT&nbsp;(*)<% if (OrderBy != null && OrderBy.equals("C_COMMENT")) { %><span class="ewTableOrderIndicator"><% if (((String) session.getAttribute("customer_OT")).equals("ASC")) {%>5<% }else if (((String) session.getAttribute("customer_OT")).equals("DESC")) { %>6<% } %></span><% } %></a> </span></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <% // Avoid starting record > total records if (startRec > totalRecs) { startRec = totalRecs; } // Set the last record to display stopRec = startRec + displayRecs - 1; // Move to first record directly for performance reason recCount = startRec - 1; if (rs.next()) { rs.first(); rs.relative(startRec - 1); } long recActual = 0; if (startRec == 1) rs.beforeFirst(); else rs.previous(); while (rs.next() && recCount < stopRec) { recCount++; if (recCount >= startRec) { recActual++; %> <% String bgcolor = "#FFFFFF"; // Set row color %> <% if (recCount%2 != 0) { // Display alternate color for rows bgcolor = "#F5F5F5"; } %> <% String x_C_CUSTKEY = ""; String x_C_NAME = ""; String x_C_ADDRESS = ""; String x_C_NATIONKEY = ""; String x_C_PHONE = ""; String x_C_ACCTBAL = ""; String x_C_MATSEGMENT = ""; String x_C_COMMENT = ""; // Load Key for record String key = ""; key = String.valueOf(rs.getLong("C_CUSTKEY")); // C_CUSTKEY x_C_CUSTKEY = String.valueOf(rs.getLong("C_CUSTKEY")); // C_NAME if (rs.getString("C_NAME") != null){ x_C_NAME = rs.getString("C_NAME"); }else{ x_C_NAME = ""; } // C_ADDRESS if (rs.getString("C_ADDRESS") != null){ x_C_ADDRESS = rs.getString("C_ADDRESS"); }else{ x_C_ADDRESS = ""; } // C_NATIONKEY x_C_NATIONKEY = String.valueOf(rs.getLong("C_NATIONKEY")); // C_PHONE if (rs.getString("C_PHONE") != null){ x_C_PHONE = rs.getString("C_PHONE"); }else{ x_C_PHONE = ""; } // C_ACCTBAL x_C_ACCTBAL = String.valueOf(rs.getDouble("C_ACCTBAL")); // C_MATSEGMENT if (rs.getString("C_MATSEGMENT") != null){ x_C_MATSEGMENT = rs.getString("C_MATSEGMENT"); }else{ x_C_MATSEGMENT = ""; } // C_COMMENT if (rs.getString("C_COMMENT") != null){ x_C_COMMENT = rs.getString("C_COMMENT"); }else{ x_C_COMMENT = ""; } %> <tr bgcolor="<%= bgcolor %>"> <td><span class="jspmaker"><% out.print(x_C_CUSTKEY); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_NAME); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_ADDRESS); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_NATIONKEY); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_PHONE); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_ACCTBAL); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_MATSEGMENT); %></span>&nbsp;</td> <td><span class="jspmaker"><% out.print(x_C_COMMENT); %></span>&nbsp;</td> <td><span class="jspmaker"><a href="<% key = rs.getString("C_CUSTKEY"); if (key != null && key.length() > 0) { out.print("customerview.jsp?key=" + java.net.URLEncoder.encode(key,"UTF-8")); }else{ out.print("javascript:alert('Invalid Record! Key is null');"); } %>">View</a></span></td> <td><span class="jspmaker"><a href="<% key = rs.getString("C_CUSTKEY"); if (key != null && key.length() > 0) { out.print("customeredit.jsp?key=" + java.net.URLEncoder.encode(key,"UTF-8")); }else{ out.print("javascript:alert('Invalid Record! Key is null');"); } %>">Edit</a></span></td> <td><span class="jspmaker"><a href="<% key = rs.getString("C_CUSTKEY"); if (key != null && key.length() > 0) { out.print("customeradd.jsp?key=" + java.net.URLEncoder.encode(key,"UTF-8")); }else{ out.print("javascript:alert('Invalid Record! Key is null');"); } %>">Copy</a></span></td> <td><span class="jspmaker"><a href="<% key = rs.getString("C_CUSTKEY"); if (key != null && key.length() > 0) { out.print("customerdelete.jsp?key=" + java.net.URLEncoder.encode(key,"UTF-8")); }else{ out.print("javascript:alert('Invalid Record! Key is null');"); } %>">Delete</a></span></td> </tr> <% // } } } %> </table> </form> <% // Close recordset and connection rs.close(); rs = null; stmt.close(); stmt = null; conn.close(); conn = null; }catch(SQLException ex){ out.println(ex.toString()); } %> <table border="0" cellspacing="0" cellpadding="10"><tr><td> <% boolean rsEof = false; if (totalRecs > 0) { rsEof = (totalRecs < (startRec + displayRecs)); int PrevStart = startRec - displayRecs; if (PrevStart < 1) { PrevStart = 1;} int NextStart = startRec + displayRecs; if (NextStart > totalRecs) { NextStart = startRec;} int LastStart = ((totalRecs-1)/displayRecs)*displayRecs+1; %> <form> <table border="0" cellspacing="0" cellpadding="0"><tr><td><span class="jspmaker">Page</span>&nbsp;</td> <!--first page button--> <% if (startRec==1) { %> <td><img src="images/firstdisab.gif" alt="First" width="20" height="15" border="0"></td> <% }else{ %> <td><a href="customerlist.jsp?start=1"><img src="images/first.gif" alt="First" width="20" height="15" border="0"></a></td> <% } %> <!--previous page button--> <% if (PrevStart == startRec) { %> <td><img src="images/prevdisab.gif" alt="Previous" width="20" height="15" border="0"></td> <% }else{ %> <td><a href="customerlist.jsp?start=<%=PrevStart%>"><img src="images/prev.gif" alt="Previous" width="20" height="15" border="0"></a></td> <% } %> <!--current page number--> <td><input type="text" name="pageno" value="<%=(startRec-1)/displayRecs+1%>" size="4"></td> <!--next page button--> <% if (NextStart == startRec) { %> <td><img src="images/nextdisab.gif" alt="Next" width="20" height="15" border="0"></td> <% }else{ %> <td><a href="customerlist.jsp?start=<%=NextStart%>"><img src="images/next.gif" alt="Next" width="20" height="15" border="0"></a></td> <% } %> <!--last page button--> <% if (LastStart == startRec) { %> <td><img src="images/lastdisab.gif" alt="Last" width="20" height="15" border="0"></td> <% }else{ %> <td><a href="customerlist.jsp?start=<%=LastStart%>"><img src="images/last.gif" alt="Last" width="20" height="15" border="0"></a></td> <% } %> <td><a href="customeradd.jsp"><img src="images/addnew.gif" alt="Add new" width="20" height="15" border="0"></a></td> <td><span class="jspmaker">&nbsp;of <%=(totalRecs-1)/displayRecs+1%></span></td> </td></tr></table> </form> <% if (startRec > totalRecs) { startRec = totalRecs;} stopRec = startRec + displayRecs - 1; recCount = totalRecs - 1; if (rsEof) { recCount = totalRecs;} if (stopRec > recCount) { stopRec = recCount;} %> <span class="jspmaker">Records <%= startRec %> to <%= stopRec %> of <%= totalRecs %></span> <% }else{ %> <span class="jspmaker">No records found</span> <p> <a href="customeradd.jsp"><img src="images/addnew.gif" alt="Add new" width="20" height="15" border="0"></a> </p> <% } %> </td></tr></table> <%@ include file="footer.jsp" %>
c#调用dll库。一个奇怪的问题~
现在要做的事情是需要用c#调用c++写的dll,当dll(dll怎样跟硬件通讯的不管)读取到卡片信息时,通过回调函数把卡片信息传递到C#这边来 ``` c# 这边调用此方法设置回调函数: [DllImport("TCP102_SDK.dll", EntryPoint = "?TCP102_InitCallBack@@YGEKPAU_CALLBACK_FUN@@@Z")] public unsafe static extern byte TCP105_InitCallBack(uint dwUser, ref CALLBACK_FUN p_call_back);troller@@YGEPADEE@Z")] 回调函数: //STRUCT [StructLayout(LayoutKind.Sequential)] public struct CARD_NUMBER_MSG { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] ControllerIP; public uint CommandSeq; public uint ReaderID; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] CardID; public string print() { return "CARD_NUMBER_MSG information : ControllerIP:" + String.Format("{0}.{1}.{2}.{3}", ControllerIP[0], ControllerIP[1], ControllerIP[2], ControllerIP[3]) + " CommandSeq:" + CommandSeq + " ReaderID: " + ReaderID + " CardID " + String.Format("{0}|长度:{1}", CardID[0], CardID.Length); } } public delegate void ReadedCardNumber(uint dwUser, ref CARD_NUMBER_M SG p_card_msg); [StructLayout(LayoutKind.Sequential)] public struct CALLBACK_FUN { public ReadedCardNumber p_ReadedCardNumberCallBack; } ``` ``` c++里面的设置回调函数的代码: /****************************************************************************************************** * Function Name : TCP102SetReceivedDataCallBack * Description : 设置回调 * Arguments : None. * Output : None. * Return : None. * Note(s) : None. *******************************************************************************************************/ TCP102_SDK_API unsigned char __stdcall TCP102_InitCallBack(DWORD dwUser,CALLBACK_FUN *p_call_back) { if((NULL==p_call_back)||(0==dwUser)) { return TCP102_ERR_PARAMETER; } //设置回调函数指针 ReadedCardNumberCallBack = p_call_back->p_ReadedCardNumberCallBack; h_CallBackWindow = dwUser; return TCP102_ERR_OK; } ``` 要实现的功能就是正确的初始化、设置回调函数...后,当sdk有读到卡片数据后,将读到的数据通过回调函数传递到c#这边来。 现在的问题是,第一次触发dll把读到的卡片信息回调到c#这边可以正确执行。但第二次就报未实例化对象的错误了。想知道有大神遇到过这样的问题吗?求解答。(目前调试的结果是还没触发回调方法就报未实例化对象的错了,在想是不是没找到回调方法的指针地址.)
C# 如何根本性解决中double类型的非空检测 C#计算器
本人大一,学习C#知识时遇到这样一个问题,win10自带的计算器无法进行多项计算,所以想自己写个,的mun1判断的非空问题而无法继续往下写了,下面为运算代码和截图,请csdn大佬支个招 ![图片说明](https://img-ask.csdn.net/upload/201912/06/1575563536_461323.png) public partial class Form1 : Form { public Form1() { InitializeComponent(); } double reasult=0,memory=0.0; double num2,num1; double oper; string temp; private void Form1_Load(object sender, EventArgs e) { this.Text = "计算器"; } private void Num(object sender, EventArgs e) { Button a = (Button)sender;//判断数值按钮实现数值输入 if (numout.Text == "0") { numout.Text = a.Text; } else { numout.Text += a.Text; } } private void yunshuan(object sender, EventArgs e)//实现运算公式 { if (numout.Text != "") { temp = num1.ToString(); if (temp != "") { num2 = double.Parse(numout.Text); switch (oper) { case '+': num1 = num1 + num2; break; case '-': num1 = num1 - num2; break; case '*': num1 = num1 * num2; break; case '÷': if (num2 == 0) { MessageBox.Show("0不能为除数"); break; } else { num1 = num1 / num2; break; } } oper = char.Parse(((Button)sender).Text); numout.Text = ""; } else { numout.Text = num1.ToString(); num1 = double.Parse(numout.Text); oper = char.Parse(((Button)sender).Text); numout.Text = ""; foot.Text += "运行一次"; } } } private void button16_Click(object sender, EventArgs e) { /* if (numout.Text != "") { num2 = double.Parse(numout.Text); switch (oper) { case '+': reasult = num1 + num2; break; case '-': reasult = num1 - num2; break; case '*': reasult = num1 * num2; break; case '÷': if (num2 == 0) { MessageBox.Show("0不能为除数"); break; } else { reasult = num1 / num2;break; } } } */ numout.Text = num1.ToString(); } private void button11_Click(object sender, EventArgs e) { } private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { } } }
C#请问三层架构要怎么实现?
这是我的代码,这个我没有用三层架构,我直接在UI层的按钮事件就写完了,请问要怎么改成三层架构呢,BLL要干什么,DAL要干什么? 这是登陆后,显示个人信息的。 2、另外当我datareader,用getstring之后,如果遇到int型的就读不出来然后就结束了,这怎么办,我只能把数据库里int型的改成vchar凑合过去了。。。 public SqlConnection GetConn() { return new SqlConnection("Data Source=localhost;Initial Catalog=Library;Integrated Security=True"); }//获取链接字符串 private void information_Load(object sender, EventArgs e) { textBox1.Text = Userhelper.id; using (SqlConnection c = GetConn()) { textBox1.Text = Userhelper.id; string sqlString = "select Rname,Rage,Rsex,Rdep from Reader where Rno=" + Userhelper.id; SqlCommand cmd = new SqlCommand(sqlString, c); c.Open(); SqlDataReader r = cmd.ExecuteReader(); while (r.Read()) { textBox2.Text = r.GetString(0); textBox3.Text = r.GetString(1); textBox4.Text = r.GetString(2); textBox5.Text = r.GetString(3); } } }
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!)
XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与姓名填写在答题纸上。 1、 以下数据结构中不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 我的答案:C 4、 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段()。 A、 概要设计 B、详细设计 C、可行性分析 D、需求分析 我的答案:B 5、 下列关于栈的叙述中正确的是()。 A、 在栈中只能插入数据 B、在栈中只能删除数据 B、 栈是先进先出的线性表 D、栈是先进后出的线性表 我的答案:D 6、 下面不属于软件设计原则的是()。 A、 抽象 B、模块化 C、自底向上 D、信息隐蔽 我的答案:C 7、 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为()。 A、 N+1 B、N C、(N+1)/2 D、N/2 我的答案:C 8、 视图设计一般有3种设计次序,下列不属于视图设计的是()。 A、 自顶向下 B、由外向内 C、由内向外 D、自底向上 我的答案:C 9、下列有关数据库的描述,正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、数据库系统的三级模式分别为(级联)模式、内部级模式与外部级模式。 13、在最坏情况下,冒泡排序的时间复杂度为(N+1/2)。 14、在面向对象方法中,信息隐蔽是通过对象的(封装)性来实现的。 15、关系模型的数据操纵既是建立在关系上的数据操纵,一般有(插入)、增加、删除、和修改四种操作。 16、TIME()的返回值的数据类型是(String)类型。 17、编写SQL语句 1)、创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 我的答案: create table student( studentCardNo number(2) primary key, name char(10), age number(2), sex char(2) check(sex in (‘男’,’女’)), address varchar2(100), tel number(2) ) 2)、修改学生表的结构,添加一列信息,学历 我的答案: alter table student add(xueli varchar2(20)); 3)、修改学生表的结构,删除一列信息,家庭住址 我的答案: alter table student drop column address; 4)、向学生表添加如下信息: 学号 姓名 年龄 性别 联系电话 学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 我的答案: insert into student values(‘&1’,’&2’,’&3’); 一次一次添加 5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” 我的答案: update student set xueli=”大专” where tel like 11%; 6)删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 我的答案: delete student where name like C% or sex=”男”; 7)查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号显示出来 我的答案: select name,studentCardNo from student where age<22 and xueli=”大专”; 8)查询学生表的数据,查询所有信息,列出前25%的记录 我的答案: select top*0.25 from student; 9)查询出所有学生的姓名,性别,年龄降序排列 我的答案: select name,sex,age from student where age desc; 10)按照性别分组查询所有的平均年龄 我的答案: select avg(age) from student group by sex; 18、什么是存储过程?为什么存储过程要比单纯的SQL语句执行起来要快? 我的答案: 存储过程算是一种优化查询需要比单存SQL语句执行的要快 19、两张关联表,删除主表中已经在副表中没有的信息 我的答案 delete from fubiao a where a.fid not in(select id from zhubiao) 20、程序题: 用1、2、2、3、4、5这六个数字,用java或你熟悉的语言,打印出所有不同的排列,如:512234、412345等,要求:“4”不能再第三位,“3”与“5”不能相连。并将这些数据按从小到大输出。 我的答案 我的写的不好 没贴下 笔试的时候没写全 21、String 和 StringBuffer的区别 我的答案 String定长 StringBuffer 变长 22、&和&&的区别 我的答案 &短路与 &&逻辑与 网上答案: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(and)。 23、final,finally,finalize的区别 我的答案 Final静变量关键字,finally异常关键字,finalize 网上答案 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 24、数组有没有length()这个方法?String有没有length()这个方法? 我的答案: 数组没有length()这个方法,有length的属性。 String有length()这个方法。 25、是否可以继承String类? 我的答案: 不可以 解释的很乱 26、说出数据连接池的工作机制是什么? 我的答案: 反正解释的很乱我感觉 27、垃圾回收的优点和原理。并考虑2种回收机制。 我的答案: 动态回收 解释的很乱 网上答案: Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解, 它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念, 只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有 使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 28、你所知道的集合类都有哪些?区别?主要方法? 我的答案: Arraylist 非线性的、Vertor线性的 29、JSP的内置对象及方法。 我的答案: Page,exception,out,page content,application,request,reponse,session,config 30、页面间对象传递的方法。 我的答案: 那几个方法都写错了 31、你知道Request对象的主要方法有哪些? 32、J2EE是技术还是平台还是框架? 我的答案: J2EE是技术也是平台 网上答案: J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种(例如GBK编码类型)编码的字符串? Request encording(“GBK”) 34、j2ee常用的设计模式?说明工厂模式。 Gof23种设计模式 工厂模式:Factory 网上答案: Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。 然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。 当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 35、JSP四种会话跟踪技术 我的答案: Application cookie session 36、排序都有哪几种方法?请举例 冒泡 选择 快序 二分查找 网上答案: 排序的方法有:插入排序(直接插入排序、希尔排序), 交换排序(冒泡排序、快速排序), 选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 递归地使用快速排序方法对left 进行排序 递归地使用快速排序方法对right 进行排序 所得结果为l e f t + m i d d l e + r i g h t 37、关于模块间的设计原则? 规范要一样 38、项目过程一般是怎样的?你参加过几个项目开发?参加过的项目流程是怎样的?自己负责与人合作工作内容及自我评价? 从需求调研——设计开发——实施 参加过网站的实施 模板的制作 39、tomcat自动关闭常见原因? 我的答案: 现在没遇到过 40、如何设置TOMCAT内存和连接数? 我的答案: Tomcat群集 41、你如何理解Tomcat是什么? 我的答案: Tomcat是JSP Servlet 容器恰当的说 42、静态变量和实例变量的区别? 我的答案: 静态变量域用final修饰,每次都被调用 实例变量则不会 43、IE、FF下面CSS的解释区别 我的答案: 自己编的 44、web前端技术你了解哪些技术? 我的答案: JAVAScript,CSS,DIV,Ajax,Ajax框架,DWR,dojo,jguery 45、什么是报表?什么是报表控件,作用是什么?你了解哪些报表工具? 我的答案: 解释的很乱 46、你了解的那些统计图表类型? 我的答案: 自己编的 47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ------------------------------------------------------- 我答错的、 错在哪里? 没答上的帮忙解答下? 感激了 !
本人是新手,这个程序还有没实现的一点小问题,调试了很久都没有结果!求帮助!
程序代码如下: 现在遇到的问题是:1、cout<<"输入q退出,输入1进入系统!"; 执行这一句的时候,输入任意的字符都能进入下面的操作,怎么改可以只在输入1的时候进入系统 2、如何把判断输入的字符串或者数值是不是相应的进制数加到对应的函数体内(如下/* */),如何实现(重新输入)功能? void AnyBinary2DecConvert::NumConvert(string SrcNum, int ConvertType) { int i; int len = SrcNum.size(); int a[100]; string test; switch (ConvertType) { case BINARY: //2进制 /*for (i=0;i<=len;i++) { if (a[i] ==0 ||a[i] ==1) { continue; } else { cout<<"该数据不是二进制数,请重新输入!"<<endl; } return;*/ } case OCTAL: //8进制 case HEX: //16进制 for(i = 0; i < len; i++) { m_CovertedNumber += Char2Dec(SrcNum[i]) * pow(ConvertType, len-i-1);//计算ConvertType的len-i-1次幂 } cout << m_CovertedNumber << endl; break; default: cout << "error" << endl; break; } return; } #include <IOSTREAM> #include <STRING> #include <CMATH> #include <CSTDLIB> using namespace std; const int BINARY = 2; // 定义2进制数常量 const int OCTAL = 8; // 定义8进制数常量 const int DEC = 10; // 定义10进制数常量 const int HEX = 16; // 定义16进制数常量 const int DEC2ANYBIN = 0; // 10进制转2\8\16进制 const int ANYBIN2DEC = 1; // 2\8\16进制转10进制 class NumConvertMethod//定义一个NumConvertMethod基类 数字转换方法 { public: virtual ~NumConvertMethod(){};//虚析构函数 virtual void NumConvert(string SrcNum, int ConvertType) = 0;//简单类型转换 第1个是目标数据类型,第2个是源数据 }; class Dec2AnyBinaryConvert : public NumConvertMethod { public: Dec2AnyBinaryConvert();//构造函数 virtual ~Dec2AnyBinaryConvert();//虚析构函数 virtual void NumConvert(string SrcNum, int ConvertType); private: char Dec2Char(char num); string m_CovertedNumber; }; class AnyBinary2DecConvert : public NumConvertMethod { public: AnyBinary2DecConvert();//构造函数:二、八、十六进制数转十进制数 virtual ~AnyBinary2DecConvert();//虚析构函数 virtual void NumConvert(string SrcNum, int ConvertType);// 简单类型转换 第1个是目标数据类型,第2个是源数据 private: int Char2Dec(char &num); int m_CovertedNumber; }; class NumConverter//定义一个NumConverter类 { public: NumConverter(int converter);//构造函数 ~NumConverter();//析构函数 void NumConvert(string SrcNum, int ConvertType); private: NumConvertMethod *m_pnumconvertmethod; }; Dec2AnyBinaryConvert::Dec2AnyBinaryConvert() { m_CovertedNumber = "";//定义字符串为"" } Dec2AnyBinaryConvert::~Dec2AnyBinaryConvert() { m_CovertedNumber = ""; } char Dec2AnyBinaryConvert::Dec2Char(char num) //十进制转换成任意进制 { if((num <= 9) && (num >= 0))//int类型的转换成字符型 { num += 48; } else { switch(num)//把十六进制数中10——15变成A------F { case 10: num='A'; break; case 11: num='B'; break; case 12: num='C'; break; case 13: num='D'; break; case 14: num='E'; break; case 15: num='F'; break; default: break; } } return num; } AnyBinary2DecConvert::AnyBinary2DecConvert() //定义构造函数AnyBinary2DecConvert,二、八、十六进制转换十进制 { m_CovertedNumber = 0; } AnyBinary2DecConvert::~AnyBinary2DecConvert()//析构函数 { m_CovertedNumber = 0; } int AnyBinary2DecConvert::Char2Dec(char &num) { if((num <= '9') && (num >= '0'))//int类型的转换成字符型 { num -= 48; //通过ASSCII } else { switch(num)//把十六进制数中a(A)——f(F)变成10——15 { case 'A': case 'a': num=10; break; case 'B': case 'b': num=11; break; case 'C': case 'c': num=12; break; case 'D': case 'd': num=13; break; case 'E': case 'e': num=14; break; case 'F': case 'f': num=15; break; default: break; } } return num; } //10进制转2\8\16进制方法 void Dec2AnyBinaryConvert::NumConvert(string SrcNum, int ConvertType) { char temp; int trans = atoi(SrcNum.c_str());//atoi字符串转换成整型数 int i; switch (ConvertType) { case BINARY: //2进制 case OCTAL: //8进制 case HEX: //16进制 while(trans > 0) { temp = trans % ConvertType; m_CovertedNumber += Dec2Char(temp); trans = trans / ConvertType; } for(i = m_CovertedNumber.size()-1; i >= 0; i--) { cout << m_CovertedNumber[i]; } cout << endl; break; default: cout << "error" << endl; break; } return; } //2\8\16进制转10进制方法 void AnyBinary2DecConvert::NumConvert(string SrcNum, int ConvertType) { int i; int len = SrcNum.size(); int a[100]; string test; switch (ConvertType) { case BINARY: //2进制 for (i=0;i<=len;i++) { if (a[i] ==0 ||a[i] ==1) { continue; } else { cout<<"该数据不是二进制数,请重新输入!"<<endl; } return; } case OCTAL: //8进制 case HEX: //16进制 for(i = 0; i < len; i++) { m_CovertedNumber += Char2Dec(SrcNum[i]) * pow(ConvertType, len-i-1);//计算ConvertType的len-i-1次幂 } cout << m_CovertedNumber << endl; break; default: cout << "error" << endl; break; } return; } NumConverter::NumConverter(int converter) { if (converter == DEC2ANYBIN) //十进制转二、八、十六进制 { m_pnumconvertmethod = new Dec2AnyBinaryConvert(); } else if (converter == ANYBIN2DEC) //二、八、十六进制转十进制 { m_pnumconvertmethod = new AnyBinary2DecConvert(); } else { m_pnumconvertmethod = NULL; } } NumConverter::~NumConverter() { if (NULL != m_pnumconvertmethod) { delete m_pnumconvertmethod; } } void NumConverter::NumConvert(string SrcNum, int ConvertType) { m_pnumconvertmethod->NumConvert(SrcNum, ConvertType); } // 主控制台,主要实现转换控制! int main(void) { cout<<" #################################################################"<<endl; cout<<" # 欢迎使用进制数转换计算器 #"<<endl; cout<<" # 本程序由cccccccc制作! #"<<endl; cout<<" #################################################################"<<endl; string test; string kongzhi; int type=0; //转换类型: 2进制或8进制或16进制 int system=0; //转换选择:10进制转2、8、16进制 或 2、8、16进制转10进制 while (1)//非0时执行 { cout<<"输入q退出,输入1进入系统!"; cin>>kongzhi; if (kongzhi.compare(0, 1, "q", 1) != 0) { cout << "请选择转换系统:" << endl; cout << "0: 十进制 转 二\\八\\十六进制" << endl; cout << "1: 二\\八\\十六进制 转 十进制" << endl; cin >> system; if (system != 0) { cout << "请选择转换前类型:" << endl; cout << "2: 二进制" << endl; cout << "8: 八进制" << endl; //cout << "10: 十进制" << endl; cout << "16: 十六进制" << endl; } else { cout << "请选择转换后类型:" << endl; cout << "2: 二进制" << endl; cout << "8: 八进制" << endl; //cout << "10: 十进制" << endl; cout << "16: 十六进制" << endl; } cin >> type; cout<<"请输入数据:"; cin>>test; NumConverter numconA(system); numconA.NumConvert(test, type); //转换并输出转换结果 } else { cout << "你已退出本系统!" << endl; break; } return 0; } return 0; }
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
立即提问