Try   HackMD

因為字打錯導致html無法顯示頁面

問題

想要寫一個html頁面顯示如下

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

過程卻報500錯誤

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

程式碼內容

Controller層

@Controller @RequestMapping("/book") public class BookController { //controller調 service層 @Autowired @Qualifier("BookServiceImpl") private BookService bookService; //查詢全部的書籍,並返回到一個書籍展示頁面 @RequestMapping("/allBook") public String list(Model model){ List<Books> list = bookService.queryAllBook(); model.addAttribute("list",list); return "allBook"; } }

Dao層

public interface BookService { //增加一本書 int addBook(Books books); //刪除一本書 int deleteBookByID(int id); //更新一本書 int updateBook(Books books); //查詢一本書 Books queryBookById(int id); //查詢全部的書 List<Books> queryAllBook(); }

Service層

public class BookServiceImpl implements BookService{ //service調dao層:組合dao層 private BookMapper bookMapper; public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper; } @Override public int addBook(Books books) { return bookMapper.addBook(books); } @Override public int deleteBookByID(int id) { return bookMapper.deleteBookByID(id); } @Override public int updateBook(Books books) { return bookMapper.updateBook(books); } @Override public Books queryBookById(int id) { return bookMapper.queryBookById(id); } @Override public List<Books> queryAllBook() { return bookMapper.queryAllBook(); } }

從Controller層到Service層看來,程式碼應該都沒問題(因為都是直接照搬)
那問題究竟是出在哪裡?

可能的疑點

1.編碼不同

可能資料庫使用的編碼與java程式碼不同,導致顯示錯誤

2.資料類型不同

資料庫使用的類型為varchar,可能與java的detail類型不同

解法:(好心人建議,雖然我還是看不太懂)

你看你用的資料庫軟體有沒有辦法看到使用的編碼是甚麼,可能會像是 utf8mb4_unicode_ci 這樣的,或其他的格式

先確定源頭的編碼是 unicode 還是像 big5/gb2312 這種只能用在特定編碼的環境下的

如果是 unicode 的話,你先不要顯示在 jsp 上,先直接讀出來寫檔案,看文字有沒有變亂碼,若有,那應該是讀取的時候編碼錯了,所以導致 jsp 在處理的時候出問題

真正的原因與解法

是出在打錯字
原本book類中的屬性detail,誤寫為details
導致java無法用"datails"找到資料庫的"detail"
因此造成無法顯示報500的錯誤
原因異常簡單,但卻繞一大圈遠路才找到解法

@Data @AllArgsConstructor @NoArgsConstructor public class Books { private int bookID; private String bookName; private int bookCounts; private String detail; //这里打错了 你写的details 和数据库匹配不上 }