web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>FootballTeam</servlet-name>
<servlet-class>FindFootOrPk</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FootballTeam</servlet-name>
<url-pattern>/foot</url-pattern>
</servlet-mapping>
</web-app>
html文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>html調用servlet</title>
</head>
<body>
<h1 align="center">請點擊提交按鈕</h1>
<div align="center" class="footgame">
<form action="http://localhost:8080/ltb6w/foot" name="match" method="post">
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
html文件中 action=" " 雙引號中調用文件的手段很多,方法很靈活.要特別注意.
舉幾個栗子:
1 <a href="userAction.do?flag=user_regist">注冊</a>
2 例:
<form action="test.do?args=888">
<input type="button" value="submit">
</form>
通過這個方法,test.do無法讀取args,必須換成一下寫法
<form action="test.do">
<input type="hidden" name="args" value="888">
<input type="button" value="submit">
</form>
3
要在web.xml中配置servlet配置好了后 在form的action中直接寫你在web.xml中配置的<url-pattern>的名字。。例如
<servlet>
<servlet-name>AdminLogin</servlet-name>
<servlet-class>
com.java.servlet.AdminLogin
</servlet-class>
<load-on-startup>22</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AdminLogin</servlet-name>
<url-pattern>/AdminLogin</url-pattern>
</servlet-mapping>
在form的action中就直接寫AdminLogin就行了
① 完全匹配
<url-pattern>/test/list.do</url-pattern>
② 路徑匹配
<url-pattern>/*</url-pattern> struts2匹配根路徑下的全部請求
③ 擴展名匹配
<url-pattern>*.do</url-pattern> struts1
<url-pattern>*.html</url-pattern> 匹配全部html結尾的請求
<url-pattern>*</url-pattern> 不能用*,否則報錯
action寫web.xml中對應的url值~~~比如說有一個LoginServlet,他在web.xml中顯示的應該是這樣:
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
而要提交的,也就是action應該等於<url-pattern>中的內容:
action="<%=request.getContextPath()%>/loginServlet"
其中<%=request.getContextPath()%>為獲得當前工程目錄,jsp提交到servlet中必須加這個,否則會出現404找不到頁的錯誤~~
例如在web.xml中注冊如下的servlet:
<servlet>
<servlet-name>addStudent</servlet-name>
<servlet-class>org.mytest.addStudent</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addStudent</servlet-name>
<url-pattern>/servlet/addStudent</url-pattern>
</servlet-mapping>
假如說,你工程名字為HibernateApp3,JSP頁面提交表單給servlet時有兩種寫法:
1. <form action=servlet/addStudent method=post>...</form>
2. <form action=/HibernateApp3/servlet/addStudentmethod=post>...</form>
注意:/代表根目錄,如果路徑是使用/開頭,Tomcat就是webApp那個目錄,如果你不是/開頭代表你從當前工程的目錄開始,例如:webApp/HibernateApp3/
這一點非常重要,很多提交表單時發生的錯誤都是因為提交路徑出錯造成的。
這些都是從網上收集到的各種回答,總而言之,action的提交路徑,和<url-pattern></url-pattern>中的路徑保持一致就不會有錯,不過是有前提的,就是路徑入口處要是指向這個工程的,例如下面這種就是錯誤:
<form method="get" action="/yutao"> ,,而 <url-pattern>/yutao</url-pattern>,這樣提交表單時,就會報404錯誤:The requested resource is not available。因為前面的“/”,指的是服務器的根目錄,也就是Tomcat目錄下的webapps。改為:<form method="get" action="/工程名/yutao",即可。
url-parrern里面放的是servlet訪問路徑,我目前的結論是這路徑隨便寫都寫,當然,注意我上面說的。。。
import java.sql.*; import java.io.*; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/FindFootOrPk") public class FindFootOrPk extends HttpServlet { private static final long serialVersionUID = 1L; //JDBC驅動名和數據庫URL
static final String JDBC_DRIVER="com.mysql.jdbc.Driver"; static final String DB_URL="jdbc:mysql://localhost:3306/dudu";//dudu數據庫名稱 //數據庫用戶名和密碼
static final String USER="root"; static final String PASS="123456"; /** * @see HttpServlet#HttpServlet() */
public FindFootOrPk() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn=null; Statement stmt=null; //設置響應內容類型
response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); String title="前后端打通,連接數據庫,我的世界來啦!"; // String name=request.getParameter("pk"); // String link=request.getParameter("link");
String docType = "<!DOCTYPE html>\n"; out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n"); try{ // 注冊 JDBC 驅動器
Class.forName("com.mysql.jdbc.Driver"); // 打開一個連接
conn = DriverManager.getConnection(DB_URL,USER,PASS); out.println("數據庫連接成功!"); // 執行 SQL 查詢
stmt = conn.createStatement();// String sql; //foot_ball 數據庫表名稱
sql = "SELECT*FROM foot_ball"; //sql語句,一定要保證正確.最好測試一下,要不html不顯示.
ResultSet rs = stmt.executeQuery(sql); //sql語句執行的結果 // 展開結果集數據庫
while(rs.next()){ // 通過字段檢索
int id = rs.getInt("id"); String tream = rs.getString("tream"); String url = rs.getString("url"); // 輸出數據
out.println("ID: " + id); out.println(", 球隊: " + tream); out.println(", 站點 URL: " + url); out.println("<br />"); } out.println("</body></html>"); // 完成后關閉
rs.close(); stmt.close(); conn.close(); } catch(SQLException se) { // 處理 JDBC 錯誤
se.printStackTrace(); } catch(Exception e) { // 處理 Class.forName 錯誤
e.printStackTrace(); }finally{ // 最后是用於關閉資源的塊
try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }