Java语言,使用函数而不是字段来定义变量的好处是什么,为什么要用一个函数

Java语言,使用函数而不是字段来定义变量的好处是什么,为什么要用一个函数

1个回答

隐藏内部实现,对外开放接口 数据安全

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java很难模拟闭包?还是我对闭包理解有误?
今天看《Javascript高级程序设计》一书,其中对闭包下了一个定义: <br /> <br />闭包是词法表示包括不必计算的变量的函数。(原书第56页) <br /> <br />还给了一个简单的样例: <br /><pre name="code" class="js"> var t = "hello world"; function closure(){ alert(t); } </pre> <br /> <br />因为变量t在函数closure之外定义,所以closure就是一个必包。 <br /> <br />如果这样的话,用java模拟闭包有何难? <br /> <br /><pre name="code" class="java"> public class SimulateClosure{ private int num; public void setNum(int num){ this.num = num; } public void closure(int origin){ System.out.println(origin*num); } } 客户端调用: SimulateClosure sc = new SimulateClosure(); sc.setNum(1); sc.closure(5);// 输出5 sc.setNum(2); sc.closure(5);// 输出10 </pre> <br /> <br />我写的这个例子是不是闭包?closure方法也使用了方法外部的字段。。客户端调用结果也不同。。 <br /> <br />闭包就这么简单吗?还是我的理解有错误?请高手指教。 <br /><br/><strong>问题补充</strong><br/>达人们,你们在哪里??快来拍我<br/><strong>问题补充</strong><br/>谢谢猫姐!那我写的例子不是闭包,书中提供的例子是不是闭包呢?
storm的executor、task、spout、bolt的关系
``` public static class WordCountBolt extends BaseRichBolt{ OutputCollector _collector; Map<String, Integer> counts = new HashMap<>(); @Override public void prepare(Map conf,TopologyContext context,OutputCollector collector){ _collector=collector; } @Override public void execute(Tuple input){ // 接收一个单词 String word = input.getString(0); // 获取该单词对应的计数 Integer count = counts.get(word); // 计数增加 if(count == null) { count = 0; } else { count++; } // 将单词和对应的计数加入map中 counts.put(word, count); System.out.println(word + ":" + count); // 发送单词和计数(分别对应字段word和count) _collector.emit(new Values(word, count)); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer){ // 定义一个字段 declarer.declare(new Fields("word","count")); } } /** * 主函数,创建topology * @param args * @throws Exception */ public static void main(String[] args) throws Exception{ //创建一个Topology TopologyBuilder builder=new TopologyBuilder(); // 设置Spout,这个Spout的名字叫做"Spout",设置并行度为5 builder.setSpout("spout", new WordCountSpout(), 5); // 设置分词Bolt,并行度为8,它的数据来源是spout的 builder.setBolt("split", new WordSplitBolt(), 8).shuffleGrouping("spout"); // 设置计数Bolt,你并行度为12,它的数据来源是split的word字段 builder.setBolt("count", new WordCountBolt(), 12).fieldsGrouping("split", new Fields("word")); Config conf = new Config(); conf.setDebug(false); conf.setNumWorkers(3); StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); } ``` spout和bolt的executor设置为5,task为10,那实际运行的时候,它是会产生多少个实例? 如果是多例的话,在WordCountBolt中的成员变量counts不是会发生并发问题吗?
新手学习 希望大神给我写点注释,从根据编号查询开始
package dao.impl; import java.sql.*; import java.util.ArrayList; import java.util.List; import pojo.Lian; import dao.UserDao; public class UserDaoImpl implements UserDao { //用于数据库连接 Connection conn=null; //用于对结果的预处理 Statement st=null; //用于处理结果集 ResultSet rs=null; 220 public boolean getConnection(){ String driver ="com.mysql.jdbc.Driver";//数据库的驱动!! String url="jdbc:mysql://localhost:3306/zhou";//数据库的地址!! String username="root";//表示用户名称 String password="zhou";//表示用户的密码 try { //加载驱动类 Class.forName(driver); //连接数据库 conn=DriverManager.getConnection(url,username,password);//表示要使用驱动以此来链接数据库 } catch (Exception e) { e.printStackTrace();//catch作用是抓住异常 } return true; } @Override public List<Lian> getLian() { List<Lian> list=new ArrayList<Lian>();//定义一个list类 String sql="select *from lian";//用sql语句创建一个查询 try { if(this.getConnection()){//假如这个链接成功就将执行查询 //获取Statement对象执行sql语句 st=conn.createStatement(); //获取结果集 rs=st.executeQuery(sql); while(rs.next()){ //查询出所有信息,取出rs对象中的各字段名下的内容,赋值给各变量 int id=rs.getInt("id");//使用get方法 String name=rs.getString("name"); String password=rs.getString("password"); int age=rs.getInt("age"); String iphone=rs.getString("iphone"); String address=rs.getString("address"); //System.out.println("id:"+id+"name:"+name+"password:"+password+"age:"+age+"iphone:"+iphone+"address:"+address); Lian u=new Lian(); u.setId(id); u.setName(name); u.setPassword(password); u.setAge(age); u.setIphone(iphone); u.setAddress(address); list.add(u); } } } catch (SQLException e) { e.printStackTrace(); }finally{ try { rs.close();//关闭数据库 避免浪费资源 st.close();//关闭statement conn.close();//关闭链接 } catch (SQLException e) { e.printStackTrace(); } } return list;//返回list类对象 } @Override public Lian add(Lian user) { String sql="INSERT INTO lian (name,password,age,iphone,address)VALUES('"+user.getName()+"',"+user.getPassword()+",'"+user.getAge()+"','"+user.getIphone()+"','"+user.getAddress()+"')"; //利用sql语句实现list中数据的增加 if(this.getConnection()){ try { st=conn.createStatement(); int i=st.executeUpdate(sql);//当数据更新时,i的值就被重新赋予 if(i>0){ System.out.println("添加数据成功!!!"); } } catch (Exception e) { e.printStackTrace(); }finally{ try { st.close();//关闭状态集 conn.close();//关闭链接 } catch (SQLException e) { e.printStackTrace(); } } } return user; } @Override public boolean update(Lian user) {//修改lian表中数据资料 String sql="update lian set name=?,password=?,age=?,iphone=?,address=? where id=?"; try { if(this.getConnection()){ //预处理,对表链接成功与否进行判断 PreparedStatement ps=conn.prepareStatement(sql); ps.setString(1, user.getName());// 通过函数方法对新的参数赋值 i ps.setString(2,user.getPassword()); ps.setInt(3, user.getAge()); ps.setString(4, user.getIphone()); ps.setString(5, user.getAddress()); ps.setInt(6, user.getId()); ps.addBatch(); int i=ps.executeUpdate();//当数据被更改,i的值将被重新赋予 if(i>0){ System.out.println("嘿,哥们,你已经成功的更新数据了!!!"); return true;//提示数据更新成功 }else{ System.out.println("更新数据出错,再来一次???"); return false;//提示数据更新失败 } } } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(rs!=null){rs.close();}//关闭结果集 if(st!=null){st.close();}//关闭状态集 if(conn!=null){conn.close();}//关闭链接 } catch (SQLException e) { e.printStackTrace(); } } return false; } @Override public void delete(int id) { String sql="delete from lian where id=?"; //使用sql语句删除lian类中的数据 try { if(this.getConnection()){ PreparedStatement ps=conn.prepareStatement(sql); ps.setInt(1, id); //驱动将其值转化为sql整数类型值 int i=ps.executeUpdate(); if(i>0){ System.out.println("删除成功"); //提示删除成功 } } } catch (SQLException e) { e.printStackTrace(); } finally{ try { rs.close();//关闭结果集 st.close();//关闭状态集 conn.close();//关闭链接 } catch (SQLException e) { e.printStackTrace(); } } } //用户的登录 public Lian login(Lian user){ String sql="select name,password from lian"; //使用sql语句查询lian表中的姓名和密码数据 Lian us =new Lian(); //创建一个新lian表 if(this.getConnection()){ try { st=conn.createStatement(); ResultSet rs=st.executeQuery(sql); while(rs.next()){ String name=rs.getString("name"); String password=rs.getString("password"); us.setName(name); us.setPassword(password); return us; } } catch (SQLException e) { e.printStackTrace(); } } return us; } //s根据编号来查询 @Override public Lian findById(String usrId) { String sql="select * from lian where id =" +usrId; Lian u=null; try { u=new Lian(); if(this.getConnection()){ //获取Statement对象执行sql语句 st=conn.createStatement(); //获取结果集 rs=st.executeQuery(sql); while(rs.next()){ //查询出所有信息,括号里面对应的是数据库表的字段名,也就是实体类的名字 int id=rs.getInt("id"); String name=rs.getString("name"); String password=rs.getString("password"); int age=rs.getInt("age"); String iphone=rs.getString("iphone"); String address=rs.getString("address"); //System.out.println("id:"+id+"name:"+name+"password:"+password+"age:"+age+"iphone:"+iphone+"address:"+address); u.setId(id); u.setName(name); u.setPassword(password); u.setAge(age); u.setIphone(iphone); u.setAddress(address); } System.out.println(u.getName()+u.getAddress()); } return u; } catch (SQLException e) { e.printStackTrace(); }finally{ try { rs.close(); st.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return u; } } /*public static void main(String[] args) { UserDao u=new UserDaoImpl(); Lian p=new Lian(); p.setName("zhou"); p.setPassword("12456"); u.login(p); // p.setId(5); // p.setAddress("九华山"); // p.setAge(24); // p.setIphone("1345687912"); // p.setName("sanye"); // p.setPassword("123456"); // // u.add(p); //u.update(p); //u.delete(5); // List<Lian> list=u.getLian(); // // for (Lian lian : list) { // // System.out.println(lian.toString()); // } // }*/
recycview中添加底部按钮问题。
我就想在这个recycview中底部添加两个按钮 项目地址链接: https://pan.baidu.com/s/13EzJZ8CrRL6xRiFjUxJXqw 提取码: qjet ![图片说明](https://img-ask.csdn.net/upload/201903/14/1552547394_832120.png) ``` public class CollectFragment extends Fragment { public RecyclerView mCollectRecyclerView;//定义RecyclerView //定义以goodsentity实体类为对象的数据集合 private ArrayList<GoodsEntity> goodsEntityList = new ArrayList<GoodsEntity>(); //自定义recyclerveiw的适配器 private CollectRecycleAdapter mCollectRecyclerAdapter; private static ChangeFragment mChange; public static CollectFragment newInstance(ChangeFragment changeFragment) { mChange = changeFragment; Bundle args = new Bundle(); CollectFragment fragment = new CollectFragment(); fragment.setArguments(args); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //获取fragment的layout View view = inflater.inflate(R.layout.recyclerview, container, false); //对recycleview进行配置 return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initRecyclerView(view); //模拟数据 initData(); } /** * TODO 模拟数据 */ private void initData() { for (int i=0;i<10;i++){ GoodsEntity goodsEntity=new GoodsEntity(); goodsEntity.setGoodsName("模拟数据"+i); goodsEntity.setGoodsPrice("100"+i); goodsEntityList.add(goodsEntity); } } /** * TODO 对recycleview进行配置 */ private void initRecyclerView(View view) { //获取RecyclerView mCollectRecyclerView=view.findViewById(R.id.collect_recyclerView); //创建adapter mCollectRecyclerAdapter = new CollectRecycleAdapter(getActivity(), goodsEntityList); //给RecyclerView设置adapter mCollectRecyclerView.setAdapter(mCollectRecyclerAdapter); //设置layoutManager,可以设置显示效果,是线性布局、grid布局,还是瀑布流布局 //参数是:上下文、列表方向(横向还是纵向)、是否倒叙 mCollectRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); //设置item的分割线 mCollectRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL)); //RecyclerView中没有item的监听事件,需要自己在适配器中写一个监听事件的接口。参数根据自定义 mCollectRecyclerAdapter.setOnItemClickListener(new CollectRecycleAdapter.OnItemClickListener() { @Override public void OnItemClick(View view, GoodsEntity data) { //此处进行监听事件的业务处理 Toast.makeText(getActivity(),"我是item",Toast.LENGTH_SHORT).show(); mChange.changeAttractionsContent(); } }); } } ``` ``` public class CollectRecycleAdapter extends RecyclerView.Adapter<CollectRecycleAdapter.myViewHodler> { private Context context; private ArrayList<GoodsEntity> goodsEntityList; //创建构造函数 public CollectRecycleAdapter(Context context, ArrayList<GoodsEntity> goodsEntityList) { //将传递过来的数据,赋值给本地变量 this.context = context;//上下文 this.goodsEntityList = goodsEntityList;//实体类数据ArrayList } /** * 创建viewhodler,相当于listview中getview中的创建view和viewhodler * * @param parent * @param viewType * @return */ @Override public myViewHodler onCreateViewHolder(ViewGroup parent, int viewType) { //创建自定义布局 View itemView = View.inflate(context, R.layout.item_content, null); return new myViewHodler(itemView); } /** * 绑定数据,数据与view绑定 * * @param holder * @param position */ @Override public void onBindViewHolder(myViewHodler holder, int position) { //根据点击位置绑定数据 GoodsEntity data = goodsEntityList.get(position); // holder.mItemGoodsImg; holder.mItemGoodsName.setText(data.goodsName);//获取实体类中的name字段并设置 holder.mItemGoodsPrice.setText(data.goodsPrice);//获取实体类中的price字段并设置 } /** * 得到总条数 * * @return */ @Override public int getItemCount() { return goodsEntityList.size(); } //自定义viewhodler class myViewHodler extends RecyclerView.ViewHolder { private ImageView mItemGoodsImg; private TextView mItemGoodsName; private TextView mItemGoodsPrice; public myViewHodler(View itemView) { super(itemView); mItemGoodsImg = itemView.findViewById(R.id.tx_news_simple_photos_01); mItemGoodsName = itemView.findViewById(R.id.tx_news_simple_photos_title); mItemGoodsPrice = itemView.findViewById(R.id.tx_news_simple_photos_time); //点击事件放在adapter中使用,也可以写个接口在activity中调用 //方法一:在adapter中设置点击事件 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //可以选择直接在本位置直接写业务处理 //Toast.makeText(context,"点击了xxx",Toast.LENGTH_SHORT).show(); //此处回传点击监听事件 if(onItemClickListener!=null){ onItemClickListener.OnItemClick(v, goodsEntityList.get(getLayoutPosition())); } } }); } } /** * 设置item的监听事件的接口 */ public interface OnItemClickListener { /** * 接口中的点击每一项的实现方法,参数自己定义 * * @param view 点击的item的视图 * @param data 点击的item的数据 */ public void OnItemClick(View view, GoodsEntity data); } //需要外部访问,所以需要设置set方法,方便调用 private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } } ```
myeclipse加载报表配置xml文件失败,项目无法正常运行,怎么解决?
![图片说明](https://img-ask.csdn.net/upload/201904/11/1554983047_497110.png) ```<?xml version="1.0" encoding="UTF-8"?> <resources xmlns="http://www.wabacus.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wabacus.com ../xsd/wabacus.resources.xsd"> <resource key="invalid.isnotempty"> <![CDATA[#label#不能为空]]> </resource> <resource key="invalid.number"> <![CDATA[#data#不是合法数字]]> </resource> <resource key="invalid.age"> <![CDATA[#data#不是有效年龄]]> </resource> <resource key="clickorderbypage1.header"> <![CDATA[<font color='#3366FF'><i> 点击<u>工号</u>、<u>中文名</u>、<u>英文名</u>、<u>性别</u>、<u>年龄</u>、<u>出生日期</u>列的数据标题可以进行排序 </i></font>]]> </resource> <resource key="colselectedpage1.footer"> <![CDATA[<font color='#FF0000'>说明:<font color='#0000FF'> 点击页面中最右边列的向右箭头或“下载Excel”链接,可以选择要显示/下载的列 </font></font>]]> </resource> <resource key="typepromptpage1.header"> <![CDATA[<font color='#3366FF'><i>其中<u>工号</u>查询条件采用任意位置匹配,<u>中文名</u>查询条件采用起始位置匹配</i></font>]]> </resource> <resource key="typepromptpage2.footer"> <![CDATA[<font color='#3366FF'><i>其中<u>工号</u>查询条件采用任意位置匹配,<u>姓名</u>查询条件采用起始位置匹配</i></font>]]> </resource> <resource key="typepromptpage3.footer"> <![CDATA[<font color='#3366FF'><i>其中<u>工号</u>提示列采用任意位置匹配,<u>中文名</u>提示列采用起始位置匹配</i></font>]]> </resource> <resource key="rowselectpage2.report1.footer"> <![CDATA[<font color='#3366FF'><i>通过按住Ctrl键或Shift键用鼠标点击记录行进行多选</i></font>]]> </resource> <resource key="masterslavepage3.report1.header"> <![CDATA[<font color='#3366FF'><i>点击“部门编号”查看部门员工列表,点击“部门名称”查看部门详细资料</i></font>]]> </resource> <resource key="masterslavepage3_2.report1.footer"> <![CDATA[<font color='#3366FF'><i>点击“部门编号”查看部门员工列表</i></font>]]> </resource> <resource key="masterslavepage3_1.report1.footer"> <![CDATA[<font color='#3366FF'><i>点击“工号”查看员工详细资料</i></font>]]> </resource> <resource key="interceptorpage1.footer"> <![CDATA[<font color='#3366FF'><i> 1、访问报表时查看服务器控制台,通过<report/>的子标签<interceptor/>中配置的拦截器会在控制台中打印信息;<br/> 2、年龄查询条件输入值只能在10到20范围之内,超出后会被前置动作提示出错。 </i></font>]]> </resource> <resource key="interceptorpage2.footer"> <![CDATA[<font color='#3366FF'><i> 1、访问报表时查看服务器控制台,通过<report/>的属性interceptor所引用的在资源文件中定义的拦截器会在控制台中打印信息;<br/> 2、年龄查询条件输入值只能在10到20范围之内,超出后会被前置动作提示出错。 </i></font>]]> </resource> <resource key="interceptorpage3.footer"> <![CDATA[<font color='#3366FF'><i> 1、访问报表时查看服务器控制台,通过<report/>的属性interceptor所引用的拦截器JAVA类会在控制台中打印信息;<br/> 2、年龄查询条件输入值只能在10到20范围之内,超出后会被前置动作提示出错。 </i></font>]]> </resource> <resource key="title.label">员工信息列表</resource> <resource key="sequence.label">序号</resource> <resource key="no.label">工号</resource> <resource key="group.label">个人信息</resource> <resource key="name.label">姓名</resource> <resource key="sex.label">性别</resource> <resource key="age.label">年龄</resource> <resource key="birthday.label">出生日期</resource> <resource key="salary.label">工资</resource> <resource key="joinindate.label">入职日期</resource> <resource key="condition.txtno.label">工号</resource> <resource key="condition.txtage.label">年龄</resource> <resource key="l10npage.report1.footer"> <![CDATA[<font color='#3366FF'><i> 1、这里演示的是静态配置信息的本地化,对于从数据库取出的动态数据,如果要进行本地化,请参看《Wabacus框架入门与提高》文档<br/> 2、为两个查询条件都配置了校验,校验出错信息也支持本地化,校验规则与上面“客户端/服务器端校验”演示的报表一致。 </i></font>]]> </resource> <resource key="otherpage3.report1.header"> <![CDATA[ <a href="#" onclick="viewSelectedRadioValues();">查看“选择一”列选中值</a>&nbsp;|&nbsp;<a href="#" onclick="viewSelectedCheckboxValues();">查看“选择二”列选中值</a> ]]> </resource> <resource key="otherpage4_2.report1.footer"> <![CDATA[<br/><br/><font color='#3366FF'><i> 这里演示的功能按钮只是测试,虽然是“添加”或“修改”按钮,但不能对报表数据进行编辑,关于数据编辑功能的演示,请参看“数据编辑篇” </i></font>]]> </resource> <resource key="reportborderlistpage1.report5.footer"> <![CDATA[<br/><font color='red'> 注意:通过<report/>标签的bordercolor属性只能改变数据部分表格的边框颜色,如果要同时改变标题部分和外层表格的边框颜色,则需要通过修改 wabacus_system.css文件中的.cls-data-th-list、.cls-data-td-list的样式定义实现。 </font>]]> </resource> <resource key="cellresizepage.report1.header"> <![CDATA[<br/><font color='#FF0000'> 请将鼠标放在数据标题列各单元格之间进行左右移动,调整列宽</font> </font>]]> </resource> <resource key="cellresizepage.report2.footer"> <![CDATA[<br/><font color='#3366FF'> <b>说明:</b>对于复杂表头的报表,只能对顶层分组所在单元格以及没有参与列分组的列所在单元格进行移动,比如在这复杂表头报表中:<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="red">“工号”、“年龄”、“入职日期”三列</font>属于没有参与列分组的列,所以可以对它们所在单元格进行移动;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="red">“基本信息”分组</font>属于顶层分组,因为它不属于哪个分组的子分组,所以也可以对它所在单元格进行移动;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="red">“中文名”、“英文名”、“性别”三列</font>是参与了列分组的列,所以不能对它们所在单元格进行移动;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="red">“姓名”分组</font>不是顶层分组,因为它是父分组“基本信息”的一部分,所以不能对它所在单元格进行移动。 </font>]]> </resource> <resource key="celldragpage1.header"> <![CDATA[<br/><font color='#FF0000'> 请将鼠标放在数据标题列,点击后进行拖动</font> </font>]]> </resource> <resource key="interceptorpage2.report1.interceptor" type="com.wabacus.config.resource.InterceptorRes"> <interceptor> <imports> <import>com.wabacus.util.*</import> <import>java.util</import> </imports> <preaction> <![CDATA[ String age=rrequest.getStringAttribute("txtage",""); if(!age.equals("")) { try { int iage=Integer.parseInt(age); if(iage<10||iage>20) { rrequest.getWResponse().getMessageCollector().alert("输入的年龄:"+age+"起出范围,只能输入10到20之间的数字",null,true); } }catch(NumberFormatException nfe) { rrequest.getWResponse().getMessageCollector().alert("输入的年龄:"+age+"不是合法数字",null,true); } } System.out.println(new Date()+":::执行完前置动作------------------"); ]]> </preaction> <postaction> <![CDATA[ System.out.println(new Date()+":::执行完后置动作-------------------"); ]]> </postaction> </interceptor> </resource> <!-- --> <resource key="editablelistreportpage1.footer"> <![CDATA[<br/><br/><font color='#3366FF'><i> “省”、“市”、“县”三列为下拉框,且是关联下拉框</i></font>]]> </resource> <resource key="editabledetailpage2.footer"> <![CDATA[<br/><br/></br> <font color='#ff0000'>注意:</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;<font color='#3366FF'> 1、在这种编辑方式中需要先点击“修改”按钮才能修改数据;<br/><br/> &nbsp;&nbsp;&nbsp;&nbsp; 2、因为此报表的“简介”列是大字段类型,如果是Oracle数据库,且采用的不是oracle10g的jdbc驱动,则可能不能正常的完成添加操作,需要将配置文件中此报表的 <insert/>标签配置的SQL语句:insert into ...后面加上where deptno=@{deptno__old},即变为如下形式: insert into tbl_department(guid=uuid{},@{deptno},@{deptname},@{manager},@{builtdate},@{performance},@{description}) where deptno=@{deptno__old};然后重新启动即可。 </font>]]> </resource> <resource key="editpartcolpage1.footer"> <![CDATA[<br/><br/></br> <font color='#ff0000'>说明:</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;<font color='#3366FF'> 1、修改数据时:“工号”、“姓名”、“所属部门”三列不允许修改<br/> &nbsp;&nbsp;&nbsp;&nbsp; 2、添加数据时,“性别”、“出生日期”两列不允许添加 </font>]]> </resource> <resource key="coldefaultvaluepage1.report1.footer"> <![CDATA[<br/><br/></br> <font color='#ff0000'>说明:</font><br/><font color='#0000FF'> &nbsp;&nbsp;&nbsp;&nbsp;“姓名”列默认值为“无名”;<br/> &nbsp;&nbsp;&nbsp;&nbsp;“年龄”列默认值为60;<br/> &nbsp;&nbsp;&nbsp;&nbsp;“出生日期”列默认值为1980-09-23<br/> &nbsp;&nbsp;&nbsp;&nbsp;“工资”列默认值为1000<br/> &nbsp;&nbsp;&nbsp;&nbsp;“省”列默认值为广东<br/> &nbsp;&nbsp;&nbsp;&nbsp;“市”列默认值为深圳<br/> &nbsp;&nbsp;&nbsp;&nbsp;“县”列默认值为福田<br/> </font>]]> </resource> <resource key="inputboxdefaultvaluepage1.report1.footer"> <![CDATA[<br/><br/></br> <font color='#ff0000'>说明:</font><br/><font color='#0000FF'> &nbsp;&nbsp;&nbsp;&nbsp;“姓名”列的输入框默认值为“无名”;<br/> &nbsp;&nbsp;&nbsp;&nbsp;“年龄”列的输入框默认值为60;<br/> &nbsp;&nbsp;&nbsp;&nbsp;“出生日期”列的输入框默认值为1980-09-23<br/> &nbsp;&nbsp;&nbsp;&nbsp;“工资”列的输入框默认值为1000<br/> &nbsp;&nbsp;&nbsp;&nbsp;“省”列的输入框默认值为广东<br/> &nbsp;&nbsp;&nbsp;&nbsp;“市”列的输入框默认值为深圳<br/> &nbsp;&nbsp;&nbsp;&nbsp;“县”列的输入框默认值为福田<br/> </font>]]> </resource> <resource key="editablemasterslavepage1.report3.footer"> <![CDATA[<br/><br/> <font color='#ff0000'>说明:</font><br/><font color='#0000FF'> &nbsp;&nbsp;&nbsp;&nbsp; 1、“详细资料1”和“详细资料2”两个细览报表是两种不同编辑方式的细览报表,它们都依赖于“员工信息列表”报表。<br/> &nbsp;&nbsp;&nbsp;&nbsp; 2、“详细资料1”和“详细资料2”两个细览报表均配置为不允许修改“工号”列,其它列均允许修改。 </font>]]> </resource> <resource key="editableFormatListPage1.footer"> <![CDATA[<br/><br/><font color='#ff0000'>说明:</font><font color='#0000FF'>&nbsp;&nbsp;在只读模式时,将此报表的“工号”列格式化为一个超链接</font>]]> </resource> <resource key="editableFormatDetailPage1.footer"> <![CDATA[<br/><br/><font color='#ff0000'>说明:</font><font color="#0000ff">使用只读访问模式访问时将“部门编号”列格式化为一个超链接,使用默认访问模式时,将“部门经理”列格式化为一超链接</font>]]> </resource> <resource key="editableFormatDetailPage2.footer"> <![CDATA[<br/><br/><font color='#ff0000'>说明:</font><font color="#0000ff"> 使用只读访问模式访问时将“部门编号”列格式化为一个超链接,如果是添加记录模式,为部门编号赋默认值111111</font>]]> </resource> <resource key="savecallbackpage2.footer"> <![CDATA[<br/><br/> <font color='#ff0000'>说明:</font><br/><font color='#0000FF'> &nbsp;&nbsp;此报表配置了一个保存回调函数打印保存的数据,并且声明执行完此回调函数后不更新报表页面的显示,<br/> &nbsp;&nbsp;这对于保存后跳转到新页面比较有用,可以提高性能,因为这种情况没必要更新页面显示。 </font>]]> </resource> <resource key="popupsinglepage1.report1.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><font color='#0000FF'> “兴趣爱好”列为弹出输入框窗口编辑框 </font>]]> </resource> <resource key="popupmultiplypage1.report1.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><font color='#0000FF'> 通过弹出窗口选择了“兴趣爱好”列的值后,会同时设置“姓名”列和“部门”列的值 </font>]]> </resource> <resource key="pageinterceptorpage1.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><font color='#0000FF'> 访问页面或操作页面上报表时,请查看控制台上各拦截器的打印信息,可以了解到不同类型、不同位置上的页面拦截器各方法的执行顺序 </font>]]> </resource> <resource key="fileuploadlistpage1.report1.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><br/> <font color='#0000FF'> &nbsp;&nbsp;1、“图片文件上传”是指上传后以<img/>标签显示出来的上传类型。<br/> &nbsp;&nbsp;2、如果要测试这里的文件上传功能,请先修改此报表配置中为此列配置的上传路径到合适路径 </font>]]> </resource> <resource key="fileuploadlistpage1.report2.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><br/><font color='#0000FF'> &nbsp;&nbsp;1、“WEB文件上传”是指上传后能通过URL在浏览器中访问到,Wabacus框架在上传这种类型的文件时,会根据用户配置的rooturl属性构造出此文件的访问URL;<br/> &nbsp;&nbsp;2、如果要测试这里的文件上传功能,请先修改此报表配置中为此列配置的上传路径到合适路径 </font>]]> </resource> <resource key="fileuploadlistpage1.report3.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><br/><font color='#0000FF'> &nbsp;&nbsp;1、“普通文件上传”就是指一般的文件上传功能,Wabacus框架上传这种类型的文件时,会在上传后返回被上传文件在服务器中的绝对路径; &nbsp;&nbsp;2、如果要测试这里的文件上传功能,请先修改此报表配置中为此列配置的上传路径到合适路径 </font>]]> </resource> <resource key="fileuploadlistpage1.report4.footer"> <![CDATA[<br/> <font color='#ff0000'>说明:</font><font color='#0000FF'> “上传后文件改名”对上面三种类型的文件上传操作都有效,是指将文件上传到服务器后,框架自动对文件进行更名。<br/> &nbsp;&nbsp;更名的类型包括如下几种:<br/> &nbsp;&nbsp;&nbsp;&nbsp;1、常量字符串;<br/> &nbsp;&nbsp;&nbsp;&nbsp;2、{date}:以当前日期做为文件名;<br/> &nbsp;&nbsp;&nbsp;&nbsp;3、{time}:以当前时间做为文件名;<br/> &nbsp;&nbsp;&nbsp;&nbsp;4、{timestamp}:以当前日期时间的毫秒数做为文件名,可以保持每次上传的文件名不重复。 </font>]]> </resource> <resource key="clobpage1.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><font color='#0000FF'>“简介”列即为大字符串类型字段。</font>]]> </resource> <resource key="formpartcoldetail1.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><br/> <font color='#0000FF'> &nbsp;&nbsp;编辑时,“婚否”、“工资”、“所属部门”三列不允许修改;<br/> &nbsp;&nbsp;添加时,“英文名”、“入职日期”两列不允许输入数据 </font>]]> </resource> <resource key="formpartcollistpage1.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><br/> <font color='#0000FF'> &nbsp;&nbsp;编辑时,“所属部门”、“省”、“市”、“县”四列不允许修改;<br/> &nbsp;&nbsp;添加时,“姓名”、“性别”两列不允许输入数据 </font>]]> </resource> <resource key="formcallbackdetailpage1.header"> <![CDATA[<br/><font color='#ff0000'>注意:</font> <font color='#0000FF'>如果要在照片列进行文件上传,请先修改此报表配置中为此列配置的上传路径到合适路径</font>]]> </resource> <resource key="formcallbacklistpage1.header"> <![CDATA[<br/><font color='#ff0000'>注意:</font> <font color='#0000FF'>如果要在照片列进行文件上传,请先修改此报表配置中为此列配置的上传路径到合适路径</font>]]> </resource> <resource key="masterslavepage1.report2.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font> <font color='#0000FF'>这里演示的主从关系是当主报表没有数据时,从报表仍然显示出来,这也是默认的主从关系</font>]]> </resource> <resource key="masterslavepage1.report4.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font> <font color='#0000FF'>这里演示的主从关系是当主报表没有数据时,从报表不显示出来</font>]]> </resource> <resource key="containerpermissionpage12.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><font color='#0000FF'>此页面上所有输入框都只读。</font>]]> </resource> <resource key="containerpermissionpage13.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><font color='#0000FF'>此页面上所有按钮都禁用,点击无效。</font>]]> </resource> <resource key="containerpermissionpage21.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><font color='#0000FF'>此页面上id为“vp1”的容器的标题授权为不显示出来。</font>]]> </resource> <resource key="containerpermissionpage41.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><font color='#0000FF'>此页面上id为“tab1”的tabpane容器配置了三个标签页显示三个报表,但第一个和第二个标签页的display权限设置为false,因此只显示了第三个标签页出来。</font>]]> </resource> <resource key="containerpermissionpage42.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font><font color='#0000FF'>此页面上id为“tab1”的tabpane容器配置了三个标签页显示三个报表,但第二个标签页的disabled权限设置为true,因此不能切换到这个标签页。</font>]]> </resource> <resource key="conditionrelatepage1.footer"> <![CDATA[<br/><font color='#ff0000'>说明:</font> <br><font color='#0000FF'>&nbsp;&nbsp;此页面共包括三个报表,其中报表一、报表二、报表三的“工号”查询条件关联,因为它们的此条件的name属性都是txtno</font> <br><font color='#0000FF'>&nbsp;&nbsp;报表一、报表三的“姓名”查询条件关联,因为它们的此条件的name属性都是txtname,但与报表二的“姓名”查询条件不关联,因为它的此查询条件的name为txtname1。</font> <br><font color='#0000FF'>&nbsp;&nbsp;报表一、报表三的“性别”查询条件不关联,因为它们的此条件的name属性不同</font> ]]> </resource> <resource key="Interceptor_saveinterceptorreport" type="com.wabacus.config.resource.InterceptorRes"> <interceptor> <imports> <import>java.util.*</import> </imports> <saveaction> <![CDATA[ List lstInsertData=rrequest.getLstInsertedData(rbean);//添加的记录集合 List lstInsertExternalVals=rrequest.getLstInsertedParamValues(rbean);//因为此报表为<insert/>配置了<external-values/> List lstUpdateData=rrequest.getLstUpdatedData(rbean);//修改的记录集合 List lstDeleteData=rrequest.getLstDeletedData(rbean);//删除的记录集合 if(lstInsertData!=null&&lstInsertData.size()>0||lstUpdateData!=null&&lstUpdateData.size()>0||lstDeleteData!=null&&lstDeleteData.size()>0) { System.out.println("--------------拦截器类型:资源项----------保存前置动作-------------------"); } Map mData; if(lstInsertData!=null&&lstInsertData.size()>0) {//当前在做添加数据的保存操作 Map mParamValues; for(int i=0;i<lstInsertData.size();i++) {//循环添加的每条记录 mData=(Map)lstInsertData.get(i); mParamValues=(Map)lstInsertExternalVals.get(i); if(mData==null) continue; System.out.println("第"+(i+1)+"条添加的记录:"); Iterator itKeys=mData.keySet().iterator(); while(itKeys.hasNext()) { String key=(String)itKeys.next(); String value=(String)mData.get(key); System.out.print("["+key+"="+value+"]"); } System.out.println(); System.out.println("此条记录对应的<params/>定义的变量值:"); itKeys=mParamValues.keySet().iterator(); while(itKeys.hasNext()) { String key=(String)itKeys.next(); String value=(String)mParamValues.get(key); System.out.print("["+key+"="+value+"]"); } System.out.println(); } } if(lstUpdateData!=null&&lstUpdateData.size()>0) {//当前在做修改数据的保存操作 for(int i=0;i<lstUpdateData.size();i++) { mData=(Map)lstUpdateData.get(i); if(mData==null) continue; System.out.println("第"+(i+1)+"条修改的记录:"); Iterator itKeys=mData.keySet().iterator(); while(itKeys.hasNext()) { String key=(String)itKeys.next(); String value=(String)mData.get(key); System.out.print("["+key+"="+value+"]"); } System.out.println(); } } if(lstDeleteData!=null&&lstDeleteData.size()>0) {//当前在做删除数据的保存操作 for(int i=0;i<lstDeleteData.size();i++) { mData=(Map)lstDeleteData.get(i); if(mData==null) continue; System.out.println("第"+(i+1)+"条删除的记录:"); Iterator itKeys=mData.keySet().iterator(); while(itKeys.hasNext()) { String key=(String)itKeys.next(); String value=(String)mData.get(key); System.out.print("["+key+"="+value+"]"); } System.out.println(); } } return super.doSave(rrequest,rbean,editbean); ]]> </saveaction> </interceptor> </resource> <resource key="Interceptor_saveinterceptorperrowpage1" type="com.wabacus.config.resource.InterceptorRes"> <interceptor> <imports> <import>java.util.*</import> </imports> <saveaction-perrow> <![CDATA[ String message=""; ```
struts+javascript 分页问题请高手们解决一下
分页问题 本人的分不太多 请高手们见谅 调用顺序是这样的 首先一个请求到到login.action的findAllUsers()方法成功执行后跳到SUCCESS相应的页面(就是3的页面 详细内容在下面), success页面通过findAllUsers()方法传过来的值进行页面传值,然后success里面形成一个如PageUtil类里面getToolsMenu()方法返回的字符串(就是首页,下一页的字符串) 现在问题出现了 当点击下一页的时候他是怎么用javascript往action里面传值的,就是这条语句document.forms(0).pages.value=1,原以为只要在login.action里面声明一个私有成员就可以实现,但是不好使,pages是login.action里面的私有成员吗?如果是用什么方法传进去的值,如果不是又怎么实现下一页的?(难道javascript可以操纵login.action里面的私有成员?) 1--------------------------------------------------------- 这个是login.action的类 请求执行里面的findAllUsers()方法 package org.login.actions; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.login.page.PageUtil; import org.login.service.IUserService; import org.login.vo.Users; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; public class Login extends ActionSupport implements ModelDriven, Preparable { private IUserService userService; private String id; private int pages = 1; private int pagesize = 3; private String pageBar; private List list; private Users user; public String getId() { return id; } public void setId(String id) { this.id = id; } public IUserService getUserService() { return userService; } public void setUserService(IUserService userService) { this.userService = userService; } public int getPages() { return pages; } public void setPages(int pageIndex) { this.pages = pageIndex; } public String getPageBar() { return pageBar; } public void setPageBar(String pageBar) { this.pageBar = pageBar; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } public void prepare() throws Exception { if (id == null || id.length() == 0) user = new Users(); else user = getUserService().getUserById(Integer.parseInt(id)); } public String execute() throws Exception { if (getUserService().isLogin(user)) { return SUCCESS; } return INPUT; } public String save() throws Exception { System.out.println(user.getUserName().toString() + &quot;@@@@@@@@@@@@@@@@@@@@@@&quot;); if (getUserService().insertUser(user)) { return SUCCESS; } return ERROR; } public String edit() { return SUCCESS; } public String update() throws Exception { if (getUserService().updateUser(user)) { return SUCCESS; } return ERROR; } // 好像不能直接对id进行操作 public String delete() throws Exception { if (getUserService().deleteUser(Integer.parseInt(id))) { return SUCCESS; } return ERROR; } public String findAllUsers() throws Exception { PageUtil page = new PageUtil(); int count = getUserService().getCount(); page.setCurPage(pages); page.setPageSize(pagesize); page.setTotalRow(count); pageBar = page.getToolsMenu(); Map pageMap = new HashMap(); pageMap.put(&quot;start&quot;, page.getStart()); pageMap.put(&quot;end&quot;, page.getEnd()); list = getUserService().getAllUser(pageMap); return SUCCESS; } public Users getModel() { return user; } public int getPagesize() { return pagesize; } public void setPagesize(int pagesize) { this.pagesize = pagesize; } } 2----------------------------------------------------- 这个是分页算法类PageUtil package org.login.page; import java.util.List; /** * ibatis分页Bean * @author Administrator * */ public class PageUtil { private int curPage = 0; //当前页 private int pageSize = 0; //每页多少行 private int endSize ; //用于not in(select top endSize id)不在多少行内 private int totalRow ; //共多少行 private int totalPage ; //共多少页 public int getStart(){ if(curPage>1) return (curPage-1)*pageSize; else return 0; } public int getEnd(){ return pageSize; } public int getCurPage() { return curPage; } public void setCurPage(int curPage) { int temp = pageSize * (curPage-1); this.setEndSize(temp); this.curPage = curPage; } public int getEndSize() { return endSize; } public void setEndSize(int endSize) { this.endSize = endSize; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalRow() { return totalRow; } public void setTotalRow(int totalRow) { totalPage = totalRow/pageSize; if(totalRow%pageSize > 0) totalPage = totalPage + 1; this.totalRow = totalRow; } public int getTotalPage(){ return this.totalPage; } public String getToolsMenu() { StringBuffer str = new StringBuffer(""); int next, prev; prev = curPage - 1; next = curPage + 1; if (curPage > 1) { str.append( "<a href=\"#\" onclick=\"document.forms(0).pages.value=1;document.forms(0).submit();\">首页</a>&nbsp;"); } else { str.append("<a href=\"#\">首页</a>&nbsp;"); } if (curPage > 1) { str.append( "<a href=\"#\" onclick='document.forms(0).pages.value=" +prev + ";document.forms(0).submit();'>上页</a>&nbsp;"); } else { str.append("<a href=\"#\">上页</a>&nbsp;"); } if (curPage < totalPage) { str.append( "<a href=\"#\" onclick='document.forms(0).pages.value=" +next + ";document.forms(0).submit();'>下页</a>&nbsp;"); } else { str.append("<a href=\"#\" >下页</a>&nbsp;"); } if (totalPage > 1 && curPage != totalPage) { str.append( "<a href=\"#\" onclick='document.forms(0).pages.value=" +totalPage + ";document.forms(0).submit();'>末页</a>&nbsp;&nbsp;"); } else { str.append("<a href=\"#\" >末页</a>&nbsp;&nbsp;"); } str.append(" 共" + totalRow + "条记录"); str.append(" 每页<SELECT size=1 name=pagesize onchange='this.form.pages.value=1;this.form.pageSize.value=this.value;this.form.submit();'>"); if (pageSize == 3) { str.append("<OPTION value=3 selected>3</OPTION>"); } else { str.append("<OPTION value=3>3</OPTION>"); } if (pageSize == 10) { str.append("<OPTION value=10 selected>10</OPTION>"); } else { str.append("<OPTION value=10>10</OPTION>"); } if (pageSize == 20) { str.append("<OPTION value=20 selected>20</OPTION>"); } else { str.append("<OPTION value=20>20</OPTION>"); } if (pageSize == 50) { str.append("<OPTION value=50 selected>50</OPTION>"); } else { str.append("<OPTION value=50>50</OPTION>"); } if (pageSize == 100) { str.append("<OPTION value=100 selected>100</OPTION>"); } else { str.append("<OPTION value=100>100</OPTION>"); } str.append("</SELECT>"); str.append("条 分" + pageSize + "页显示 转到"); str.append("<SELECT size=1 name=Pagelist onchange='this.form.pages.value=this.value;this.form.submit();'>"); for (int i = 1; i < totalPage + 1; i++) { if (i == curPage) { str.append("<OPTION value=" + i + " selected>" + i + "</OPTION>"); } else { str.append("<OPTION value=" + i + ">" + i + "</OPTION>"); } } str.append("</SELECT>页"); str.append("<INPUT type=hidden value=" + curPage + " name=\"pages\" > "); str.append("<INPUT type=hidden value=" + pageSize + " name=\"pageSize\"> "); return str.toString(); } } 3--------------------------------------------------------------------------------- 这个是success成功之后跳转的页面 也就是显示分页的页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Users list</title> <style type="text/css"> table { border-collapse: collapse; font-size: 12px; } </style> </head> <body> <br /><br /><br /><br /> <s:form action="show"> <table border="1" width="50%" align="center"> <tr bgcolor="#cccc00"> <td align="center">UserID</td> <td align="center">UserName</td> <td align="center">Password</td> <td colspan="2" align="center">Options</td> </tr> <s:iterator value="list" id="user" status="st"> <tr <s:if test="#st.odd">style="background-color:#dddddd"</s:if> <s:else>style="background-color:#eeeeee"</s:else>> <td align="center"><s:property value="id" /></td> <td align="center"><s:property value="userName" /></td> <td align="center"><s:property value="password" /></td> <td align="center"> <s:url id="update" action="edit"> <s:param name="id"> <s:property value="id" /> </s:param> <s:param name="userName"> <s:property value="userName" /> </s:param> <s:param name="password"> <s:property value="password" /> </s:param> </s:url> <s:a href="%{update}">edit</s:a> </td> <td align="center"> <s:url id="delete" action="delete"> <s:param name="id"> <s:property value="id" /> </s:param> </s:url> <s:a href="%{delete}">delete</s:a> </td> </tr> </s:iterator> <tr> <td colspan="4"> <s:property value="#request.pageBar" escape="false"/> </td> </tr> </table> </s:form> </body> </html> [b]问题补充:[/b] [i][/i][u][/u][b][/b][color=black][size=xx-large][size=x-large]我也想过是隐藏域。隐藏域可以隐士声明吗?还是那个表单实际上就是对应着action里面的私有成员?[/size][/size][/color] [b]问题补充:[/b] [b][i][color=brown][size=xx-large]我也想也是在action中的属性 但是我把pages这个属性改成pages1就不好使了,这是为什么,点下一页的时候报网页上有错误。说document.form[0].pages1.value 不是函数这是什么意思啊[/size][/color][/i][/b] [b]问题补充:[/b] [size=xx-large][color=brown]这哥们啊。我还不至于这么愚蠢,action里的我也改了,但是还是不好使。是不是有什么地方没注意的给遗漏了?(所有的pages我都改成pages1了)。[/color][/size] [b]问题补充:[/b] 还有你所说的。就算我action里面有对应的字段,我用document去取也报错了,除了那个pages,action里的什么变量都不好使,就算把pages改成pages1都不行,也说没有定义,我还没换成别的变量,就是把所有的pages改成pages1都不行.只能用pages这一个变量。[size=xx-large][/size]
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
阿里P8数据架构师:顶级开发者都在用什么数据库?
其实从去年已经隐隐约约感觉到数据库的有变化,只是没有想到变得这么快。今年的一些事情实实在在地给了某些数据库重击,如果以前去某数据库还是喊喊,然后该用还用,今年从传统领域刮起的去某数据库的风,已经开始了,并且后面的乌云密布也看得见。 最近看一篇国外的开源产品提供厂商的一篇文字,主要是在询问了他的几百位客户后得出了下图中的2019年数据库的使用趋势。 从图中可以看出,MySQL以38.9...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
互联网公司分布式系统架构演进之路
介绍 分布式和集群的概念经常被搞混,现在一句话让你明白两者的区别。 分布式:一个业务拆分成多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 例如:电商系统可以拆分成商品,订单,用户等子系统。这就是分布式,而为了应对并发,同时部署好几个用户系统,这就是集群 1 单应用架构 2 应用服务器和数据库服务器分离 单机负载越来越来,所以要将应用服务器和数据库服务器分离 3 应用服务...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
OpenCV-Python 绘图功能 | 七
目标 学习使用OpenCV绘制不同的几何形状 您将学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。 代码 在上述所有功能中,您将看到一些常见的参数,如下所示: img:您要绘制形状的图像 color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Fiddler+夜神模拟器进行APP抓包
Fiddler+夜神模拟器进行APP抓包 作者:霞落满天 需求:对公司APP进行抓包获取详细的接口信息,这是现在开发必备的。 工具:Fiddler抓包,夜神模拟器 模拟手机 安装APP 1.下载Fiddler https://www.telerik.com/download/fiddler Fiddler正是在这里帮助您记录计算机和Internet之间传递的所有HTTP和HTTPS通信...
小白学 Python 爬虫(42):春节去哪里玩(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
一文带你看清 HTTP 所有概念
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍 通用...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
[数据结构与算法] 排序算法之归并排序与基数排序
归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 基本思想 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
史上最牛逼的 Eclipse 快捷键,提高开发效率!
如果你在使用IDEA,请参考博主另外的一篇idea快捷键的博客。
如何快速打好Java基础?
二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题。我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多个年头了,真的是从一名编程白痴一步步走到现在的。 我在各大技术网站上分享了不少 Java 方面的原创文章,不知道影响了多少初学者,反正文章的留言中经常能看到他们由衷的感谢。现在每天仍然有不少同学(...
在三线城市工作爽吗?
我是一名程序员,从正值青春年华的 24 岁回到三线城市洛阳工作,至今已经 6 年有余。一不小心又暴露了自己的实际年龄,但老读者都知道,我驻颜有术,上次去看房子,业务员肯定地说:“小哥肯定比我小,我今年还不到 24。”我只好强颜欢笑:“你说得对。” 从我拥有记忆到现在进入而立之年,我觉得,我做过最明智的选择有下面三个: 1)高中三年,和一位女同学保持着算不上朋友的冷淡关系;大学半年,把这位女同学追到...
CSS操作之你不得不知的一些小技巧(一)ヾ(Ő∀Ő๑)ノ太棒了!!
目录 CSS单行/多行文本,超出隐藏并显示省略号 1. CSS单行/多行文本,超出隐藏并显示省略号 方法一:使用CSS属性 单行文本溢出显示省略号 width: 100px; overflow: hidden; text-overflow:ellipsis; //文本溢出显示省略号 white-space: nowrap; //文本不会换...
我以为我对数据库索引十分了解,直到我遇到了阿里面试官。
索引的数据结构分析,数据库面试到索引最常见的问题分析,我总结了一下。
Java第二周学习
Java第二周学习 1. 数组 1.1 定义数组格式 数据类型[] 数组名 = new 数据类型[容量]; int[] arr = new int[10]; 赋值左侧 数据类型: 告知编译器,当前数组中能够保存的数据类型到底是什么?并且在确定数据类型之后,整个数组中保存的数据类型无法修改!!! []: 告知编译器这里定义的是一个数组类型数据。 明确告知编译器,数组名是一个【引用数据类型...
有没有简单一点的 Python 小例子或小项目?
分享一波Github上适合新手入门、又十分有趣的Python项目~ 1. 人脸识别 star:30.5k 最简洁的人脸识别库。可以使用Python和命令行工具提取、识别、操作人脸。其人脸识别是基于业内领先的C++开源库dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,准确率高达99.38%。 而且有中文版README哟~ 2. faceai sta...
​人工智能如何拦截来自太空的古老电波信号?
全文共1468字,预计学习时长5分钟来源:Pexels人类对宇宙的向往,似乎是基因自带,亘古不变的。科幻小说、电影等艺术题材的昌盛,正说明了这一点。特别是随着科技发展,人类对UFO的...
看完这篇JVM,阿里面试官都不怕!
前言 只有光头才能变强 本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干了什么,具体是怎么干的。能够理解到一些初学时不懂的东西 在面试的时候有谈资 能装逼 (图片来源:https://zhuanlan.zhihu.com/p/25511795,侵删) 声...
Java基础知识面试题(2020最新版)
文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...
Spring面试题(2020最新版)
文章目录Spring概述(10)什么是spring?Spring框架的设计目标,设计理念,和核心是什么Spring的优缺点是什么?Spring有哪些应用场景Spring由哪些模块组成?Spring 框架中都用到了哪些设计模式?详细讲解一下核心容器(spring context应用上下文) 模块Spring框架中有哪些不同类型的事件Spring 应用程序有哪些不同组件?使用 Spring 有哪些方式...
用树莓派做一个人脸识别开锁应用
作者:eckygao,腾讯 CSIG 云产品部1.案例概述1.1 背景实现一个人脸识别进行开锁的功能,用在他的真人实景游戏业务中。总的来说,需求描述简单,但由于约束比较多,在架构与选型上...
C语言写个贪吃蛇游戏
贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情。这个游戏我写完后放在知乎,竟然点赞的人数超级多。我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强...
出不了门的日子,我选择在 GitHub 上快乐的打游戏
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个在家憋到长蘑菇的蒟蒻… 2020 年的开年因为一些大家都知道的原因,有些不顺,但还是要捏捏自己的脸蛋儿,微笑的面对,毕竟日子还是要过下去… 要点脸皮,不能出门,假期又一延再延,作为一个从小熟读结发悬梁铁锥刺骨囊萤照读牛角挂书等典故的社会主义好青年,我决定趁这段时间好好充实自己,争取早日上...
相关热词 c#判断数字不得为负数 c#帧和帧协议 c#算偏移值 c# 在枚举中 c#6 字符串 插值 c#程序中的占位符标签 c#监听数组变化 c# vlc c#索引实现 c# 局域网广播通信
立即提问