中和软件技术培训

上海中和软件公司培训专用博客

Java培训问题总结

Java培训课后问题答疑


关于误运行了Coverage as 之后,颜色消除的问题:

如果你使用Coverage as 运行程序之后,代码上会出现红色和绿色的背景,这个时候可以打开Eclipse底部的Coverage标签页,然后使用工具栏里面的清除来清除标记的颜色。

在做Maven实验的时候,请将视图模式切换为 JavaEE。

 

日期格式化

 

Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);

 

关于方法重载的问题:

1.方法数量相同,类型不同是可以重载的。

但是不推荐,最好使用不同的参数数来区别不同的版本。

但是如果有这样的需求也是可以的参数类型不同作为版本区别标识。

 

public class MethodOverload {
	public static void Method(int x) {
		
	}
	
	public static void Method(String x) {
		
	}
	
	public static void main(String args[]) {
		Method(1);
		Method("a");
	}
	
}

 

推荐可以看一下这篇文章   https://jingyan.baidu.com/article/22fe7ced0c597b3002617f04.html

 

关于Java的参数默认值:“默认参数”和“方法重载”同时支持的话有二义性的问题。所以Java是不支持“默认参数”的。

 

关于 String args[] 和 String[] args 有什么区别:  String args[] 和 String[] args 有什么区别

对机器来说两者一样,对人类读者来说,的确是前者好,能避免歧义和误读。

这里就不做规定那个好了,Think In Java使用的是前者,Eclipse里面使用的是后者。

注意

1.Java 会对 -127~127 的整数进行缓存

2.并且注意 == 和 equals 的区别。

== 它比较的是对象的地址

equlas 比较的是对象的内容

 


由于缓存的原因,a , b 是同一对象,地址相同

Integer a = 10;
Integer b = 10;
System.out.println(a == b);        // true
System.out.println(a.equals(b));   // true


1000不在-127~127 范围内, 所以没有缓存,a , b 是不同的对象,所以地址不同

Integer a = 1000;
Integer b = 1000;
System.out.println(a == b);        // false
System.out.println(a.equals(b));   // true

 

int是基本类型,这里的 == 可以认为直接比较值。 

int不是包装类,所以没有equals方法。

 

		int a = 1000;
		int b = 1000;
		System.out.println(a == b);        // true

 

结论:如果没有特殊原因,不要使用Integer,防止错误。如果使用Integer,请使用equals方法进行内容的比较。 

参考: http://blog.csdn.net/lanxinglan/article/details/50876036

 

关于Integer:

Integer虽然是一个对象,对象在调用方法的时候是传地址的,但是,内部封装的int是final的,无法改变值。所以交换两个数字的方法里面,int和Integer的效果一样。

交换两个数字,可以将两个数字放在数组里面。然后进行交换。或者把数字包装成其他对象。

Java没有C#里面的ref/out这样的关键字,或者Swift里面的inout关键字。无法将传值变为传地址

 

关于Scanner 

1.避免在同一个方法(或者子方法中)里面多次打开和关闭Scanner 

如果需要的话,可以将scanner对象作为参数传入到子方法中。在主方法中new和close scanner

2.关于等待用户输入的语句,以下代码效果一致

    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        // 从键盘接收数据  
        int i = 0 ;  
        float f = 0.0f ;  
        i = scan.nextInt() ; 
        System.out.println("整数数据:" + i) ; 
        scan.close(); 
    }  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        // 从键盘接收数据  
        int i = 0 ;  
        float f = 0.0f ;  
        if (scan.hasNextInt()) {
            i = scan.nextInt() ; 
            System.out.println("整数数据:" + i) ;  
        }
        scan.close();
    }  

 

如果你使用hasNextLine等待用户输入,然后使用nextInt读入用户输入,则下一个hasNextLine()将直接为True。

原因是:hasNextLine的时候,将输入的int型数字和换行符都放入了input区域,然后nextInt则只取出了int型数字,没有取出换行符。

剩余的换行符则成为hasNextLine的成立依据。

下面的代码,输入数字之后,直接打印出数字,然后文字数据则直接显示为空 

 

    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        // 从键盘接收数据  
        int i = 0 ;  
        float f = 0.0f ;  
        if (scan.hasNextLine()) {
            i = scan.nextInt() ; 
            System.out.println("整数数据:" + i) ;  
        }
        if(scan.hasNextLine()) {
            System.out.println("文字数据:" + scan.nextLine()) ;  
        }
        scan.close();
    }  

 

 

JSP无法正常显示的常见原因:

404原因:一般来说,你的JSP页面应该放在WebContent下面的,如果放在其他地方,例如WEB-INF里面是无法显示的

关于JSP里面的资源使用问题:JSP里面的资源请不要写文件的原始路径,而是写文件在网站中的路径。

class,bootstrape的样式类别名称,都必须写正确,大小写是区分的!

资源文件,路径,不要有中划线,点,空格这样的东西,不要有中文。 

Tomcat的根目录是 localhost:8080,不是你的WebApp的路径,所以在JSP里面写路径的时候,不要以  "/" 开始。

 

关于MySql的运行

1.Tomcat中,如果需要使用Mysql的驱动程序,请一定要放在  webcontent/WEB-INF/lib 下面

2.如果数据库里面抽出来的数据带有中文,请一定使用下面语句:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

使用Java做的输出,都是UTF-8格式。

3.注意,请引用  import java.sql.*;

4.如果需要在字段的值中加入转义符  “\”  ,则在Java代码中,一个 “\” ,需要写成 "\\\\"

"\\\\" 转为SQL句子的使用变成 "\\",插入数据库的时候最终变成 "\" 

 

Tomcat重复错误无法启动的解决方法:

1.删除TomcatServer下面已经加载的所有WebSite

2.重新启动干净的Tomcat

3.使用Run On Server重新启动你的工程 

 

对于一些修改配置后,WebSite没有及时更新的问题,你可以尝试将Tomcat Clean一下。

请注意:SpringFramework的启动URL和JSP是完全不同的!

 

 resources和annotation-driven必须一起加上!

<mvc:resources location="/resources/" mapping="/resources/**"/>  
<mvc:annotation-driven/>  

 

*Spring和Hibernate的xml配置文件,在你的Eclipse里面和真实运行环境里面,可能出现版本不一致的情况!!!

如果出现这样的问题,请在Tomcat的启动Log中搜索 Deploy关键字,找到Tomcat在Eclipse中的部署路径,然后确认xml文件的版本是否正确。

 

关于hibernate数据库

1.中文乱码:

<propertyname="connection.url">

jdbc:mysql://localhost:3306/training?useUnicode=true&amp;characterEncoding=UTF-8

</property>

2.关于自动更新表结构(请保证Hibernate版本更新到最新版)

<propertyname="hbm2ddl.auto">update</property>

 

请确保hibernate的版本

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.12.Final</version>
</dependency>

 

3.dialect,将MySQLDialect改为MySQL5Dialect,如果出现  SQL语句错误 type=MyISAM

<property name="dialect">

org.hibernate.dialect.MySQL5Dialect

</property>

4.hibernate.cfg.xml的位置有讲究,一般不要放在任何Java的package里面,而是和java的package并列放。

@Entity不能省略!所有的Java库import不要错误

package animal;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

@Entity
public class Movie {
	@Id
	@GeneratedValue(generator = "MyGenerator")
	@GenericGenerator(name = "MyGenerator", strategy = "native")
	int id;

	String Name;

	int Price;

	int RemainTicketNumber;

	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}

	public int getPrice() {
		return Price;
	}

	public void setPrice(int price) {
		Price = price;
	}

	public int getRemainTicketNumber() {
		return RemainTicketNumber;
	}

	public void setRemainTicketNumber(int remainTicketNumber) {
		RemainTicketNumber = remainTicketNumber;
	}

}

 

示例代码:

 

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.SharedSessionContract;
import org.hibernate.cfg.Configuration;



	public static <T> ArrayList<T> DataSqlQuery(String sql, Class<T> EntityClass) {
		Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		System.out.println(sql);
		Query query = ((SharedSessionContract) session).createSQLQuery(sql).addEntity(EntityClass);
		ArrayList<T> datalist = (ArrayList<T>) query.list();
		return datalist;
	}

	public static List DateQuery(String hql) {
		Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		System.out.println(hql);
		Query query = ((SharedSessionContract) session).createQuery(hql);
		List datalist = query.list();
		return datalist;
	}

	public static boolean ConfigurationInsert(Object arg0) {
		Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		session.beginTransaction();
		session.save(arg0);
		session.getTransaction().commit();
		session.close();
		sf.close();
		return true;
	}
	
	public static boolean ConfigurationUpdate(Object arg0) {
		Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		session.beginTransaction(); // 事务
		session.update(arg0);
		System.out.println();
		session.getTransaction().commit();
		// session.getTransaction().rollback();
		session.close();
		sf.close();
		return true;
	}
	
	public static boolean ConfigurationDelete(Object arg0) {
		Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		session.beginTransaction();
		session.delete(arg0);
		session.getTransaction().commit();
		session.close();
		sf.close();
		return true;
	}

  

5.SQL/HQL

和SQL大致相同,不过,请注意一下,Select *  不需要写。同时,注意 from Tablename,这个Tablename必须要和类名称严格一致! 

有些SQL文虽然在MySqlWorkBench中可以运行,但是在Hibernate中是会出现SQL语法警告的

同时,请注意,Select文的字段和类的字段必须保持一致,不然可能出现某个列无法找到的错误

 

6.如果你使用了hibernate-validator,则系统要求你导入javax.el库,这个库可以在Tomcat的lib下找到。如果是Web项目,则已经包含了这个库了。

 

7.关于对象和个别字段在POST时候传送的问题 个别字段放在对象的前面

 如果ConformPassword写在account之后,则ConformPassword在不输入的时候,系统会报错

	@RequestMapping(method = { RequestMethod.POST })
	public String test(Model model,String ConformPassword,
			@Valid @ModelAttribute("Login") account accounts,
			BindingResult result) throws NoSuchAlgorithmException {

8.关于数字型验证问题

数字型验证,请使用@NotNull,而不是@NotEmpty

如果数字型做Range的验证,但是没有@NotNull的验证,则不输入也算验证通过

 

9.Content下面的空文件夹不会复制到运行时目录下面,但是有文件的会。

 

10.关于RequestMapping

Controller是区分大小写的

写在Controller的类声明的RequestMapping,和具体方法里面的RequestMapping,最后会连接在一起的!

下面的例子将变成 /login/member 

 

@Controller
@RequestMapping("/login")
public class LoginController {

	@RequestMapping(value="/member", method = { RequestMethod.GET })

 

关于Hibernate查询结果的一些总结

 

public static void main(String[] args) {
    String Sql = "select groupId,SUM(RemainTicketCnt) as RemainTicketCnt from movie group by groupId";
    ArrayList<GroupResult> g = DataSqlQuery(Sql, GroupResult.class);
    for (GroupResult groupResult : g) {
        System.out.println(groupResult.groupId + ":" + groupResult.getRemainTicketCnt());
    }
}

 

1.在某些情况下,如果查询中没有group by的情况下使用了统计函数,如果查询结果为0件的时候,ArrayList的size会变成1,但是唯一的一个对象是null

2.如果查询结果中的@id项目的值相同的话,整条记录会变得相同

例如:

package scs.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

@Entity
public class User {
	@Id
	@GeneratedValue(generator = "MyGenerator")
	@GenericGenerator(name = "MyGenerator", strategy = "native")
	public int id;
	
	String Name;

	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}
}

package scs.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

@Entity
public class TicketOrder {
	@Id
	@GeneratedValue(generator = "MyGenerator")
	@GenericGenerator(name = "MyGenerator", strategy = "native")
	public int id;
	
	public int Userid;
	
	public String MovieName;
	
}

package scs.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

@Entity
public class GroupResult {
	@Id
	public int Userid;

	public String Name;

	public String MovieName;
}

 

执行下面一段代码之后

 

public static void main(String[] args) {
		
		User xUser = new User();
		xUser.setName("张三");
		ConfigurationInsert(xUser);
		
		TicketOrder o1 = new TicketOrder();
		o1.Userid = 1;
		o1.MovieName = "M1";
		ConfigurationInsert(o1);
		o1.MovieName = "M2";
		ConfigurationInsert(o1);
		o1.MovieName = "M3";
		ConfigurationInsert(o1);
		o1.MovieName = "M4";
		ConfigurationInsert(o1);
		
		
		String Sql = "SELECT Userid,Name,MovieName FROM ticketorder join user where ticketorder.Userid = user.id";
		ArrayList<GroupResult> g = DataSqlQuery(Sql, GroupResult.class);
		for (GroupResult groupResult : g) {
			System.out.println(groupResult.Userid + ":" + groupResult.MovieName);
		}
	}

3.千万不要认为在MySql WorkBench中的结果肯定会原封不动的返回给Hibernate

4.复杂查询希望使用视图来做,视图可以和表一样查询,但是不能修改!

CREATE
ALGORITHM = UNDEFINED
DEFINER = root@localhost
SQL SECURITY DEFINER
VIEW movie.ssum AS
SELECT
a.ID AS id,
a.filmname AS filmname,
b.online AS online,
SUM(a.buycount) AS sumticket
FROM
(movie.buyrecord a
JOIN movie.moiveticket b)
WHERE
(a.filmname = b.FilmName)
GROUP BY a.filmname

 

Spring Framework 请按照以下步骤解决404问题:

0.Console里面查看错误日志

1.重启Server,观察在Spring加载阶段的Log中是否存在找不到的路径

2.Controller里面的大小写是否正确,Controller区分大小写

3.RequestMap是否设置有问题

4.设置断点,或者打印Log确认是否进入指定的Controller

5.查看所需的Jsp文件是否存在

 

 

关于ModelMap的问题

 下面这段代码中,如果我们加断点进行Debug的话,可以发现GET的时候,Model是空的。

在POST的时候,Model是有值的,包括了

1.modelAttribute的值

2.modelAttribute验证结果

所以当你将Model传递到其他控制器的时候,验证结果也随着传递过去了。

但是,Post的值,如果不将Request传递到其他控制器的话,则getParament取不到值。

(GET的参数和POST的INPUT都可以通过Request得到)

 

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
	<h2>${message}</h2>
	<form:form action="/scs.com/details" Method="post"
		modelAttribute="Some">
		<form:input path="username" type="text" />
		<form:input path="password" type="password" />
		<input name="NotInClass" type="text" />
		<input type="submit" value="Run" />
	</form:form>
</body>
</html>
package controller;

import javax.servlet.http.HttpServletRequest;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MoveAction;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;

@Controller

public class HelloController{
   @RequestMapping(value="/hello",method = RequestMethod.GET)
   public String printHello(ModelMap model,HttpServletRequest request) {
	  if (!model.containsAttribute("message")) model.addAttribute("message", "Hello Spring MVC Framework!");
	  movie m = new movie();
      m.setTitle("妖猫传");
      model.addAttribute("movie", m);
      if (!model.containsAttribute("Some")) model.addAttribute("Some",new account());
      return "hello";
   }
   @RequestMapping(value="/details")
   public String Details(ModelMap model,@ModelAttribute("Some") account some,HttpServletRequest request) {
	// TODO Auto-generated constructor stub
	   model.addAttribute("Price", 12);
	   return "hello";
   }
   
}

博文最后更新时间:


评论

  • 暂无评论

发表评论

博客统计

访问量:34716

博文总数:18 评论总数:21

原创17 翻译0 转载1