目錄
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>strutschu第一次萊尼聯</display-name>
<filter>
<!-- Struts2 的核心類配置,是必須配置 -->
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 一個filter可以對應多個mapping,出了寫成/*還可以攜程.action表示攔截以此結尾的請求 -->
<!-- 攔截以後所有的東西都交由action來查找,action加載Struts.xml該配置文件和Struts1放在web-INF下不同,它是放在src文件夾下的 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 中文亂碼過濾器配置——但是管不了ajax和action方法的結果交互 -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.bdqn.utils.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <!-- //頭必須要改成這個 -->
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!-- 設置了下面的配置,只需要在頁面輸入方法.action就可以準確定位方法所在位置了 -->
<global-allowed-methods>regex:.*</global-allowed-methods> <!-- //2.5版本以上要加這一句 -->
<!-- 下面這個action默認的是走method=“execute"方法 -->
<action name="GoodsAction" class="com.bdqn.action.GoodsAction">
<!-- 結果爲“success”時,跳轉至success.jsp頁面 -->
<result name="success">/index.jsp</result>
<!-- 結果爲"error"時,跳轉至fail.jsp頁面 -->
<result name="error">/fail.jsp</result>
<allowed-methods>findALL</allowed-methods> <!-- ←這裏是爲了後面快捷訪問網址/項目名/action的name+"!"+方法名.action 配置的對應方法 -->
</action>
<!-- 下面的action配置,每個對應的都是action中的一個method,前面的名字可以隨意取,只是在其它地方的引用名字 -->
<action name = "findALLAction" class = "com.bdqn.action.GoodsAction" method = "findALL">
<result name="success">/index.jsp</result>
</action>
<action name = "DeleteGoods" class = "com.bdqn.action.GoodsAction" method = "DeleteGoods">
<result name="success" type="redirectAction">fenye</result>
</action>
<action name = "addGoods" class = "com.bdqn.action.GoodsAction" method = "addGoods">
<result name="success" type="redirectAction">fenye</result>
</action>
<action name = "fenye" class = "com.bdqn.action.GoodsAction" method = "fenye">
<result name="success">/index.jsp</result>
</action>
<action name = "update" class = "com.bdqn.action.GoodsAction" method = "update">
<result name="success" type="redirectAction">fenye</result>
</action>
<action name = "findById" class = "com.bdqn.action.GoodsAction" method = "findById">
</action>
<!-- 標準的只有一個execute方法的實例,假如method不寫,默認找execute,假如class不寫默認找actionsupprt,假如result的name不寫默認走success -->
<action name="Users1Action" class="com.bdqn.action.Users1Action">
<!-- <result type="redirectAction" name="success">findALLAction</result> -->
<result name="success" type="redirectAction">fenye</result>
<result name="error">/Login.jsp</result>
<allowed-methods>login</allowed-methods> <!-- ←這裏是爲了後面快捷訪問網址/項目名/action的name+"!"+方法名.action 配置的對應方法 -->
</action>
</package>
</struts>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--設置外置配置文件-->
<properties resource="database.properties"></properties>
<!--設置各種參數,包括類別名-->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<!--設置類別名 p29-->
<typeAliases>
<package name="com.bdqn.entity"/>
</typeAliases>
<!--p30 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置數據庫連接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${pwd}" />
</dataSource>
</environment>
</environments>
<!--p31 -->
<mappers>
<!-- 註冊userMapper.xml文件, userMapper.xml位於me.gacl.mapping這個包下,所以resource寫成me/gacl/mapping/userMapper.xml -->
<mapper resource="com/bdqn/dao/GoodsMapper.xml"/>
<mapper resource="com/bdqn/dao/Users1Mapper.xml"/>
</mappers>
</configuration>
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
database.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl1
user=system
pwd=1234
com.bdqn.entity
Goods.java
package com.bdqn.entity;
/*
* 實體類雖然沒什麼好說的:但是對應的是Oracle所以有幾點要注意
* 如果在數據庫的number是2位只能用byte,4位short,6位int,所以一般都設置爲6位
*/
public class Goods {
private int id;
private String name;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Goods() {
super();
// TODO Auto-generated constructor stub
}
public Goods(int id, String name, double price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
}
Users1.java
package com.bdqn.entity;
/*
* 實體類雖然沒什麼好說的:但是對應的是Oracle所以有幾點要注意
* 如果在數據庫的number是2位只能用byte,4位short,6位int,所以一般都設置爲6位
*/
/*
* 由於Oracle數據庫user是關鍵字,所以不能用user建表
*/
public class Users1 {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Users1(int id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
public Users1() {
super();
// TODO Auto-generated constructor stub
}
}
com.bdqn.utils
EncodingFilter.java
package com.bdqn.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
System.out.println("過濾器");
response.setCharacterEncoding("UTF-8");
}
public void destroy() {
// TODO Auto-generated method stub
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
MyBatis.java
package com.bdqn.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatis {
private static SqlSessionFactory factory;
static{
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession createSqlSession(){
return factory.openSession(false);
//這樣就不自動提交事務了
}
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession!=null) {
sqlSession.close();
}
}
}
com.bdqn.dao
GoodsMapper.java
package com.bdqn.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.bdqn.entity.Goods;
public interface GoodsMapper {
//查詢全部信息
List<Goods> findALL();
//根據id刪除對應的數據
int deleteGoods(@Param("id")int id);
//添加商品
int addGoods(Goods goods);
//分頁方法:這兩個one和two不是第幾頁,也不是每頁幾條,這是通過index和size計算出來的,筆記在有道筆記
List<Goods> fenye(@Param("one")int one,@Param("two")int two);
//跟分頁查詢配套的方法:用來查詢一個弄有幾條數據,用來計算總頁數的
int findCount();
//修改方法:底層寫成了MMyBatis的動態SQL
int update(Goods goods);
//通過id來尋找一個商品:跟修改是配套方法
Goods findById(@Param("id")int id);
}
GoodsMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bdqn.dao.GoodsMapper">
<select id="findALL" resultType="Goods">
select * from goods
</select>
<!-- 這個分頁查詢方法語句有個小於號是絕對報錯的,所以把它替換成< -->
<select id="fenye" resultType="Goods">
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM goods) A
WHERE ROWNUM < #{one} ) WHERE RN >= #{two}
</select>
<select id="findCount" resultType="int">
select count(1) from goods
</select>
<select id="findById" resultType="Goods">
select * from goods where id = #{id}
</select>
<delete id="deleteGoods" parameterType="int">
delete from goods where id = #{id}
</delete>
<insert id="addGoods" parameterType="Goods">
insert into goods values(goods_sequence.nextval,#{name},#{price})
</insert>
<update id="update" parameterType="Goods">
update goods
<set>
<if test="name != null">name = #{name},</if>
<if test="price != null">price = #{price},</if>
</set>
where id = #{id}
</update>
</mapper>
Users1Mapper.java
package com.bdqn.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.bdqn.entity.Users1;
public interface Users1Mapper {
//登錄驗證方法
List<Users1> login (@Param("name")String name,@Param("password")String password);
}
Users1Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bdqn.dao.Users1Mapper">
<select id="login" resultType="Users1">
select * from users1 where name=#{name} and password=#{password}
</select>
</mapper>
com.bdqn.action
GoodsAction.java
package com.bdqn.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.session.SqlSession;
import org.apache.struts2.ServletActionContext;
import com.alibaba.fastjson.JSONArray;
import com.bdqn.dao.GoodsMapper;
import com.bdqn.entity.Goods;
import com.bdqn.utils.MyBatis;
import com.opensymphony.xwork2.ActionSupport;
public class GoodsAction extends ActionSupport{
//說實話Struts2是個很好用的框架,其它的框架都需要用request來獲取值,然後在來進行轉換,還有可能爲空報錯
//但是在Struts2只需設置一個變量並給他set和get方法就可以直接使用這個變量名來存值取值
//返回信息的變量
private String mess;
//記錄頁面刪除按鈕的value的值
private int Delete;
//添加方法封裝用戶傳來的信息
private Goods addGoods;
//默認設置第一次訪問第一個頁面
private int index = 1;
//每頁顯示兩條數據
private int size = 2;
//一共有幾頁
private int count = 1;
//傳遞修改方法的對象封裝
private Goods goods;
//查詢全部方法——在頁面有一個查詢全部的按鈕,跳轉路徑寫的就是這個方法
public String findALL() throws Exception {
//使用MyBatisSQL語句的方法,先獲取sqlsession鏈接對象
//其它的步驟都封裝在utils包下了
SqlSession session = MyBatis.createSqlSession();
//調用GoodsMapper下的方法,他會自動根據MyBAtis下的配置,自動去尋找xml的SQL語句
List<Goods> list = session.getMapper(GoodsMapper.class).findALL();
//使用完一定要關閉鏈接,不然查詢的時候鏈接太多會造成多連接是的緩慢和延遲,親身體驗過!
MyBatis.closeSqlSession(session);
//在Struts2獲取request和response可以通過核心類來獲取
HttpServletRequest request= ServletActionContext.getRequest();
//獲取session鏈接
HttpSession session1 = request.getSession();
session1.setAttribute("list", list);
return SUCCESS;
}
//刪除的方法
public String DeleteGoods() throws Exception {
//使用MyBatisSQL語句的方法,先獲取sqlsession鏈接對象
//其它的步驟都封裝在utils包下了
SqlSession session = MyBatis.createSqlSession();
//調用GoodsMapper下的方法,他會自動根據MyBAtis下的配置,自動去尋找xml的SQL語句
session.getMapper(GoodsMapper.class).deleteGoods(Delete);
//記得事物是一定要提交纔會寫入數據庫,不然你的SQL語句是對的,返回結果是一但是查詢和數據庫都是空的就很難受了!親身體驗!
session.commit();
MyBatis.closeSqlSession(session);
return SUCCESS;
}
//添加一個新的商品方法
public String addGoods() throws Exception {
//使用MyBatisSQL語句的方法,先獲取sqlsession鏈接對象
//其它的步驟都封裝在utils包下了
SqlSession session = MyBatis.createSqlSession();
//調用GoodsMapper下的方法,他會自動根據MyBAtis下的配置,自動去尋找xml的SQL語句
int count = session.getMapper(GoodsMapper.class).addGoods(addGoods);
session.commit();
MyBatis.closeSqlSession(session);
return SUCCESS;
}
//分頁查詢方法
public String fenye() throws Exception {
SqlSession session = MyBatis.createSqlSession();
//先獲取數據庫該表有幾條數據total,直接寫一個select count(1) from goods就可以了
int total = session.getMapper(GoodsMapper.class).findCount();
//用頁面量size和total來計算一共該顯示幾頁,就算最後一頁只有一條數據,也應該用一頁來顯示,所以必須先計算total/size是不是等於0
count = total%size==0?total/size:(total/size)+1;
//當一直點擊上一頁,到了第一頁時就不能讓index繼續減小,因爲沒有第0頁
if (index<1) {
index=1;
//同理到了最大頁數的時候也不能讓他繼續加大
}else if(index>count){
index=count;
}
//這是計算分頁語句需要的參數值小於第幾條數據
int one = (((index-1)*size)+1)+size;
//這是計算該從第幾條數據開始顯示
int two = ((index-1)*size)+1;
//分頁方法
List<Goods> list = session.getMapper(GoodsMapper.class).fenye(one, two);
//使用完關閉下
MyBatis.closeSqlSession(session);
//獲取request和sqlsession
HttpServletRequest request= ServletActionContext.getRequest();
HttpSession session1 = request.getSession();
//在把值存入session之前先清空原先的值
session1.removeAttribute("list");
session1.setAttribute("list", list);
return SUCCESS;
}
public String update() throws Exception {
SqlSession session = MyBatis.createSqlSession();
int count = session.getMapper(GoodsMapper.class).update(goods);
session.commit();
MyBatis.closeSqlSession(session);
return SUCCESS;
}
public String findById() throws Exception {
//獲取和響應器獲取
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//這裏跟Ajax前端交互,但是過濾器是沒有的,所以手動設置
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//獲取前端的id值然後查出該對象,然後返回給前端
int id = Integer.parseInt(request.getParameter("id"));
Goods good = MyBatis.createSqlSession().getMapper(GoodsMapper.class).findById(id);
//用的是Ajax的json傳值方法
response.getWriter().print(JSONArray.toJSONString(good));
return NONE;
}
public String getMess() {
return mess;
}
public void setMess(String mess) {
this.mess = mess;
}
public int getDelete() {
return Delete;
}
public void setDelete(int delete) {
Delete = delete;
}
public Goods getAddGoods() {
return addGoods;
}
public void setAddGoods(Goods addGoods) {
this.addGoods = addGoods;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
}
Users1Action.java
package com.bdqn.action;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.bdqn.dao.Users1Mapper;
import com.bdqn.entity.Users1;
import com.bdqn.utils.MyBatis;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
//在struts2中我們有兩種選擇繼承的方法:
//第一:implements Action這種方法必須實現execute方法,
//但是我們假如生成了EXEcute方法,在後面多方法時地址跳轉的時候,會默認先找尋
//
public class Users1Action extends ActionSupport{
//由於Struts有個很方便的屬性封裝的功能,所以我們只需要在action中
//定義變量和它的set和get方法就可以前後頁面互相傳值
//不用通過request.getparameter來獲取了
private String name;
private String password;
//登錄驗證方法
public String login() throws Exception {
SqlSession session = MyBatis.createSqlSession();
List<Users1> list= session.getMapper(Users1Mapper.class).login(name,password);
if (list.size()>0) {
return SUCCESS;
}
//這裏的返回值有兩種寫法:
//要麼"success"或者SUCCESS,這兩種寫法的效果是等同的
//大寫的方法只有五個參數,指代不同的意思是Struts2自帶的
//SUCCESS成功
//ERROR失敗
//NONE 什麼時都不返回
//LOGIN
//INPUT
//這些是java的默認final值所以需要大寫,其實代表的意思還需到配置文件去配置,纔會有效果;
return ERROR;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Users1Action() {
super();
// TODO Auto-generated constructor stub
}
public Users1Action(String name, String password) {
super();
this.name = name;
this.password = password;
}
}
WEB-INF
lib
commons-fileupload-1.3.3.jar
commons-io-2.5.jar
commons-lang3-3.6.jar
fastjson-1.2.6.jar
freemarker-2.3.26-incubating.jar
javassist-3.20.0-GA.jar
log4j-1.2.17.jar
log4j-api-2.10.0.jar
mybatis-3.2.2.jar
mybatis-3.4.6.jar
mysql-connector-java-5.1.0-bin.jar
ognl-3.1.15.jar
ojdbc6.jar
struts2-core-2.5.17.jar
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
</head>
<body>
<div style="width: 400px;height: 400px;position: absolute;top: 50%;left: 50%;margin-left: -200px;margin-top: -200px;border: 1px solid black">
<table border="2">
<tr><td><a href="/封裝變量/Users1Action/findALLAction"><button>全部查詢</button></a></td></tr>
<tr>
<td>ID</td>
<td>商品名</td>
<td>價格</td>
<td>操作</td>
</tr>
<c:forEach items="${list}" var="li" varStatus="str">
<tr>
<td>${li.id}</td>
<td>${li.name}</td>
<td>${li.price}</td>
<td>
<a href="/封裝變量/DeleteGoods?Delete=${li.id}"><button>刪除</button></a>
<a><button name="updateButton" value="${li.id}">修改</button></a>
</td>
</tr>
</c:forEach>
</table>
<p>
共${count}/${index}頁
<a href="/封裝變量/GoodsAction/fenye?index=1&size=${size}&count=${count}"><button>首頁</button></a>
<a href="/封裝變量/GoodsAction/fenye?index=${index-1}&size=${size}"><button>上一頁</button></a>
<a href="/封裝變量/GoodsAction/fenye?index=${index+1}&size=${size}"><button>下一頁</button></a>
<a href="/封裝變量/GoodsAction/fenye?index=${count}&size=${size}"><button>尾頁</button></a>
</p>
<p><button id="add">上架商品</button></p>
<div id="addGoods" style="display: none">
<form action="/封裝變量/GoodsAction/addGoods">
填寫新增商品名稱:<input type="text" name="addGoods.name"><br/>
填寫價格:<input type="text" name="addGoods.price"><br/>
<input type="submit" value="新增">
</form>
</div>
<div id="update" style="display: none">
<form action="/封裝變量/GoodsAction/update">
修改商品名稱:<input type="text" name="goods.name" id="goodsname"><br/>
修改商品價格:<input type="text" name="goods.price" id="goodsprice"><br/>
<input type="hidden" name="goods.id" id="goodsid"><br/>
<input type="submit" value="修改">
</form>
</div>
</div>
<script>
$(function(){
/* 點擊事件,只要點擊添加按鈕,就顯示添加表單 */
$("#add").bind("click",function(){
$("#addGoods").fadeIn(2000);
});
/* 只要點擊修改事件,就獲取該按鈕的value值,對應該行的商品id,然後把id給後臺,獲取goods對象,把值給表單,客戶修改完後再提交 */
$("[name='updateButton']").bind("click",function(){
var id = $(this).val();
$.ajax({
url:"http://localhost:8080/封裝變量/GoodsAction/findById",
type:"post",
data:{"id":id},
dataType:"json",
success:function(data){
alert(data.name);
$("#goodsname").val(data.name);
$("#goodsprice").val(data.price);
}
});
$("#goodsid").val(id);
$("#update").show();
});
});
</script>
</body>
</html>
Login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'Login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<div style="width: 400px;height: 100px;position: absolute;top: 50%;left: 50%;margin-left: -200px;margin-top: -50px ">
<form action="/封裝變量/Users1Action!login.action">
登錄名:<input type="text" name="name"><br/>
密碼:<input type="text" name="password"><br/>
<input type="submit" value="提交">
</form>
</div>
</body>
</html>