a.搭建 DAO 環境
1.建立表和對應的序列
2.建立一個項目 導入jar包(ioc aop dao 數據庫驅動 連接池) 拷貝配置文件到src下
3.根據表設計一個實體類 ,實體類就常用的四個字段一頓生成就完事了。
4.設計DAO 接口
public interface XdlBankAccountDAO {
int insertXdlBankAccount(XdlBankAccount account);
}
5.實現DAO 接口 不繼承JdbcDaoSupport
開啓組件掃描 把dao放入容器 注入JdbcTemplate
在容器中創建JdbcTemplate --- 創建DataSource
<!-- 開啓組件掃描-->
<context:component-scan base-package="com.xdl"></context:component-scan>
<!-- 配置數據流對象-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"></property>
<property name="username" value="system"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 創建一個模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>
使用API 完成 插入
public class XdlBankAccountDAOImpl implements XdlBankAccountDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int insertXdlBankAccount(XdlBankAccount account) {
String sql = "insert into xdl_bank_account values(xdl_bank_account_id_seq.nextval,"
+ "?,?,?)";
try {
return jdbcTemplate.update(sql,account.getAcc_no(),account.getAcc_password(),account.getAcc_money());
} catch (DataAccessException e) {
e.printStackTrace();
}
return 0;
}
}
6.包裝一個Service 測試
@Service("banService")
public class XdlBankAccountService {
@Resource
private XdlBankAccountDAO bankdao;
public boolean register(XdlBankAccount account) {
return bankdao.insertXdlBankAccount(account)==1?true:false;
}
}
測試
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
XdlBankAccountService bankAccountService = app.getBean(XdlBankAccountService.class);
XdlBankAccount account = new XdlBankAccount(0, "abc", "123456", 456);
System.out.println(bankAccountService.register(account));
}
b.搭建MVC環境
1.建項目 導入jar (mvc) 拷貝配置文件 WEB-INF下建立頁面
2.在web.xml 中配置DispatcherServlet
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3.開啓組件掃描 和 開啓標註形式mvc
<!-- 開啓標註形式mvc-->
<mvc:annotation-driven />
4.編寫控制器類 設計方法 使用@Controller 和 @RequestMapping
@Controller
public class XdlRegisterController {
@Autowired
private XdlBankAccountService bankService;
@RequestMapping("/toRegister.do")
public String toRegister() {
return "register";
}
@RequestMapping("/toMain.do")
public String toMain() {
return "main";
}
@RequestMapping("/register.do")
public String register(XdlBankAccount account,HttpServletRequest request){
System.out.println(account);
if (bankService.register(account)) {
return "redirect:toMain.do";
}else{
request.setAttribute("msg","註冊失敗");
return "register";
}
}
5.配置視圖處理器
<!-- 配置視圖處理器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
c.DAO 和 MVC 結合
2.中文參數的亂碼問題
2.1 之前的方式依然可用 --- 但是你得完全使用之前的方式
@RequestMapping("/register2.do")
public String register2(HttpServletRequest request) {
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String acc_no = request.getParameter("acc_no");
System.out.println(acc_no);
return "main";
}
2.2 使用過濾器 對編碼提前設置 --- Spring 提供了編碼過濾器 只針對post請求
web.xml文件配置過濾器
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
登錄邏輯的控制器
@Controller
public class XdlLoginController {
@RequestMapping("/toLogin.do")
public String toLogin() {
return "login";
}
@RequestMapping("/login.do")
public String login(String acc_no,String acc_password,
HttpServletRequest request) {
if ("abc".equals(acc_no)&&"123".equals(acc_password)) {
return "main";
} else {
request.setAttribute("msg", "登錄失敗");
return "login";
}
}
}
登錄頁面
<form action="login.do" method="post">
賬號:<input type="text" name="acc_no"><br>
密碼:<input type="password" name="acc_password"><br>
<input type="submit" value="登錄">${msg}
</form>
3.問題:現在寫了一個程序 可以跳轉到登錄頁面 也可以根據賬號和密碼 進行登錄
也有一個邏輯toMain.do 。要求用戶在沒有登錄的情況下 不能使用toMain.do 只有
用戶登錄成功的情況下 才能使用toMain.do,如果沒有登錄的情況下 訪問toMain.do
就跳轉到登錄頁面。
4.攔截器的三個方法
HandlerInterceptor 的方法
preHandle() handlerMapping 處理之後 Controller 執行之前
返回值是boolean 返回true代表運行 Controller 以及以後的邏輯
返回false 則終止後續調用
postHandle() 控制器代碼執行之後 ViewResolver 執行之前 返回值void
afterCompletion() 視圖處理器之後 返回之前 返回void
5.如何實現攔截器
a.寫一個類 實現 HandlerInterceptor 接口 主要覆蓋 preHandle
b.在Spring 容器對應的配置文件中 配置攔截器 和 對應的設置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/某個具體請求" />
<bean class="包名.攔截器名"/>
</mvc:interceptor>
</mvc:interceptors>
mapping 攔截哪些路徑 *代表一級請求 ** 代表多級請求
exclude-mapping 直接不過攔截器的請求 可以配置多個 /user/*
第三個問題的解決:1.實現HandlerInterceptor接口然後覆蓋preHandle方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object method) throws Exception {
String acc_no = (String) request.getSession().getAttribute("acc_no");
System.out.println(acc_no);
if (acc_no!=null) {
return true;
} else {
response.sendRedirect("toLogin.do");
return false;
}
}
2.在spring配置文件中,配置攔截器。需要注意的是對一些功能的放行,不然後導致程序的邏輯死亡。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/toLogin.do" />
<mvc:exclude-mapping path="/login.do" />
<mvc:exclude-mapping path="/toregister.do" />
<mvc:exclude-mapping path="/register.do" />
<bean class="com.xdl.interceptor.XdlCheckLoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>