Spring DAO 和 MVC 結合 中文編碼問題 攔截器的使用

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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章